本文目錄一覽:
- 1、用C語言實現拉格朗日插值、牛頓插值、等距結點插值算法
- 2、C語言實現拉格朗日插值法的問題
- 3、關於拉格朗日插值的編程問題,要用c語言的。
- 4、拉格朗日插值法用C語言表示
- 5、拉格朗日差值多項式的c語言
- 6、拉格朗日插值用c語言怎麼編程?各位高手幫幫忙啦
用C語言實現拉格朗日插值、牛頓插值、等距結點插值算法
#includestdio.h
#includestdlib.h
#includeiostream.h
typedef struct data
{
float x;
float y;
}Data;//變量x和函數值y的結構
Data d[20];//最多二十組數據
float f(int s,int t)//牛頓插值法,用以返回插商
{
if(t==s+1)
return (d[t].y-d[s].y)/(d[t].x-d[s].x);
else
return (f(s+1,t)-f(s,t-1))/(d[t].x-d[s].x);
}
float Newton(float x,int count)
{
int n;
while(1)
{
cout”請輸入n值(即n次插值):”;//獲得插值次數
cinn;
if(n=count-1)// 插值次數不得大於count-1次
break;
else
system(“cls”);
}
//初始化t,y,yt。
float t=1.0;
float y=d[0].y;
float yt=0.0;
//計算y值
for(int j=1;j=n;j++)
{
t=(x-d[j-1].x)*t;
yt=f(0,j)*t;
//coutf(0,j)endl;
y=y+yt;
}
return y;
}
float lagrange(float x,int count)
{
float y=0.0;
for(int k=0;kcount;k++)//這兒默認為count-1次插值
{
float p=1.0;//初始化p
for(int j=0;jcount;j++)
{//計算p的值
if(k==j)continue;//判斷是否為同一個數
p=p*(x-d[j].x)/(d[k].x-d[j].x);
}
y=y+p*d[k].y;//求和
}
return y;//返回y的值
}
void main()
{
float x,y;
int count;
while(1)
{
cout”請輸入x[i],y[i]的組數,不得超過20組:”;//要求用戶輸入數據組數
cincount;
if(count=20)
break;//檢查輸入的是否合法
system(“cls”);
}
//獲得各組數據
for(int i=0;icount;i++)
{
cout”請輸入第”i+1″組x的值:”;
cind[i].x;
cout”請輸入第”i+1″組y的值:”;
cind[i].y;
system(“cls”);
}
cout”請輸入x的值:”;//獲得變量x的值
cinx;
while(1)
{
int choice=3;
cout”請您選擇使用哪種插值法計算:”endl;
cout” (0):退出”endl;
cout” (1):Lagrange”endl;
cout” (2):Newton”endl;
cout”輸入你的選擇:”;
cinchoice;//取得用戶的選擇項
if(choice==2)
{
cout”你選擇了牛頓插值計算方法,其結果為:”;
y=Newton(x,count);break;//調用相應的處理函數
}
if(choice==1)
{
cout”你選擇了拉格朗日插值計算方法,其結果為:”;
y=lagrange(x,count);break;//調用相應的處理函數
}
if(choice==0)
break;
system(“cls”);
cout”輸入錯誤!!!!”endl;
}
coutx” , “yendl;//輸出最終結果
}
C語言實現拉格朗日插值法的問題
下面是我所寫的拉格朗日C語言實現的程序,經運行正確
#includestdio.h
int main()
{
float x,y;
float a[3]={100,121,144};
float b[3]={10,11,12};
int i,j,k=0;
float t;
y=0;
printf(“請輸入x的值:”);
scanf(“%f”,x);
for(k=0;k3;k++)
{
t=1;
for(j=0;j=2;j++)
if(j!=k)
{
t=((x-a[j])/(a[k]-a[j]))*t;
}
y=y+t*b[k];
}
printf(“y=%f\n”,y);
}
關於拉格朗日插值的編程問題,要用c語言的。
#include stdio.h
#include stdlib.h
#include malloc.h
doubleLAG(int,double *,double *,double);
voidmain()
{
intn;
double *x,*y,t,lag;
t = 0.15;
n = 6;
x = (double*)calloc(n,sizeof(double));
if(x == NULL)
{
printf(“內存分配失敗\n”);
exit(1);
}
y = (double*)calloc(n,sizeof(double));
if(y == NULL)
{
printf(“內存分配失敗\n”);
exit(1);
}
x[0] = 0;
x[1] = 0.1;
x[2] = 0.195;
x[3] = 0.3;
x[4] = 0.401;
x[5] = 0.5;
y[0] = 0.39894;
y[1] = 0.39695;
y[2] = 0.39142;
y[3] = 0.38138;
y[4] = 0.36812;
y[5] = 0.35206;
lag = LAG(n,x,y,t);
printf(“拉各朗日插值後得到的結果是:\n”);
printf(“f(%.2f)=%e\n”,t,lag);
free(x);
free(y);
}
doubleLAG(n,x,y,t)
intn;
double *x;
double *y;
doublet;
{
inti,j;
doublep,s;
s = 0;
for(i=0;in-1;i++)
{
p = 1;
for(j=0;jn-1;j++)
if(i!=j)
p*=(t-x[j])/(x[i]-x[j]);
s+=p*y[i];
}
return (s);
}
曲線擬合:
#include stdio.h
#include stdlib.h
#include malloc.h
#include math.h
Smooth(double *,double *,double *,int,int,
double *,double *,double *);
voidmain()
{
inti,n,m;
double *x,*y,*a,dt1,dt2,dt3,b;
n = 20;
m = 6;
b = 0;
/*分別為x,y,a分配存貯空間*/
x = (double *)calloc(n,sizeof(double));
if(x == NULL)
{
printf(“內存分配失敗\n”);
exit (0);
}
y = (double *)calloc(n,sizeof(double));
if(y == NULL)
{
printf(“內存分配失敗\n”);
exit (0);
}
a = (double *)calloc(n,sizeof(double));
if(a == NULL)
{
printf(“內存分配失敗\n”);
exit (0);
}
for(i=1;i=n;i++)
{
x[i-1]=b+(i-1)*0.1;
/*每隔0.1取一個點,這樣連續取n個點*/
y[i-1]=x[i-1]-exp(-x[i-1]);
/*計算x[i-1]點對應的y值作為擬合已知值*/
}
Smooth(x,y,a,n,m,dt1,dt2,dt3); /*調用擬合函數*/
for(i=1;i=m;i++)
printf(“a[%d] = %.10f\n”,(i-1),a[i-1]);
printf(“擬合多項式與數據點偏差的平方和為:\n”);
printf(“%.10e\n”,dt1);
printf(“擬合多項式與數據點偏差的絕對值之和為:\n”);
printf(“%.10e\n”,dt2);
printf(“擬合多項式與數據點偏差的絕對值最大值為:\n”);
printf(“%.10e\n”,dt3);
free(x); /*釋放存儲空間*/
free(y); /*釋放存儲空間*/
free(a); /*釋放存儲空間*/
}
Smooth(x,y,a,n,m,dt1,dt2,dt3 )
double *x; /*實型一維數組,輸入參數,存放節點的xi值*/
double *y; /*實型一維數組,輸入參數,存放節點的yi值*/
double *a; /*雙精度實型一維數組,長度為m。返回m一1次擬合多項式的m個係數*/
intn; /*整型變量,輸入參數,給定數據點的個數*/
intm; /*整型變量,輸入參數,擬合多項式的項數*/
double *dt1; /*實型變量,輸出參數,擬合多項式與數據點偏差的平方和*/
double *dt2; /*實型變量,輸出參數,擬合多項式與數據點偏差的絕對值之和*/
double *dt3; /*實型變量,輸出參數,擬合多項式與數據點偏差的絕對值最大值*/
{
inti,j,k;
double *s,*t,*b,z,d1,p,c,d2,g,q,dt;
/*分別為s,t,b分配存貯空間*/
s = (double *)calloc(n,sizeof(double));
if(s == NULL)
{
printf(“內存分配失敗\n”);
exit (0);
}
t = (double *)calloc(n,sizeof(double));
if(t == NULL)
{
printf(“內存分配失敗\n”);
exit (0);
}
b = (double *)calloc(n,sizeof(double));
if(b == NULL)
{
printf(“內存分配失敗\n”);
exit (0);
}
z = 0;
for(i=1;i=n;i++)
z=z+x[i-1]/n; /*z為各個x的平均值*/
b[0]=1;
d1=n;
p=0;
c=0;
for(i=1;i=n;i++)
{
p=p+x[i-1]-z;
c=c+y[i-1];
}
c=c/d1;
p=p/d1;
a[0]=c*b[0];
if(m1)
{
t[1]=1;
t[0]=-p;
d2=0;
c=0;
g=0;
for(i=1;i=n;i++)
{
q=x[i-1]-z-p;
d2=d2+q*q;
c=y[i-1]*q+c;
g=(x[i-1]-z)*q*q+g;
}
c=c/d2;
p=g/d2;
q=d2/d1;
d1=d2;
a[1]=c*t[1];
a[0]=c*t[0]+a[0];
}
for(j=3;j=m;j++)
{
s[j-1]=t[j-2];
s[j-2]=-p*t[j-2]+t[j-3];
if(j=4)
for(k=j-2;k=2;k–)
s[k-1]=-p*t[k-1]+t[k-2]-q*b[k-1];
s[0]=-p*t[0]-q*b[0];
d2=0;
c=0;
g=0;
for(i=1;i=n;i++)
{
q=s[j-1];
for(k=j-1;k=1;k–)
q=q*(x[i-1]-z)+s[k-1];
d2=d2+q*q;
c=y[i-1]*q+c;
g=(x[i-1]-z)*q*q+g;
}
c=c/d2;
p=g/d2;
q=d2/d1;
d1=d2;
a[j-1]=c*s[j-1];
t[j-1]=s[j-1];
for(k=j-1;k=1;k–)
{
a[k-1]=c*s[k-1]+a[k-1];
b[k-1]=t[k-1];
t[k-1]=s[k-1];
}
}
*dt1=0;
*dt2=0;
*dt3=0;
for(i=1;i=n;i++)
{
q=a[m-1];
for(k=m-1;k=1;k–)
q=q*(x[i-1]-z)+a[k-1];
dt=q-y[i-1];
if(fabs(dt)*dt3)
*dt3=fabs(dt);
*dt1=*dt1+dt*dt;
*dt2=*dt2+fabs(dt);
}
/*釋放存儲空間*/
free(s);
free(t);
free(b);
return(1);
}
拉格朗日插值法用C語言表示
我的程序是牛頓插值和拉格朗日插值合起來,你自己看下,用的是C++
#include iostream
#include iomanip
#include stdlib.h
using namespace std;
#define N 100
void lagrange()
{
int n,k,m,q=1;
float x[N],y[N],xx,yyy1,yyy2,yy1,yy2,yy3;
cout”請輸入X的個數:”;
cinn;
for(k=0;k=n-1;k++)
{
cout”請輸入X”k”的值:”;
cinx[k];
cout”請輸入Y”k”的值:”;
ciny[k];
}
system(“cls”);
cout”則Xi與Yi表格如下:”endl;
cout”Xi”” “;for(k=0;k=n-1;k++)coutsetiosflags(ios::left)setw(10)x[k];
coutendl;
cout”Yi”” “;for(k=0;k=n-1;k++)coutsetiosflags(ios::left)setw(10)y[k];
coutendl;
while(q)
{
cout”請輸入所求x的值:”;
cinxx;
while(xxx[k-1]||xxx[0])
{
cout”輸入錯誤,請重新輸入:”;
cinxx;
}
for(k=0;k=n-1;k++)
{
if(xxx[k])
{
m=k-1;
k=n-1;
}
}
yyy1=y[m]*((xx-x[m+1])/(x[m]-x[m+1]))+y[m+1]*((xx-x[m])/(x[m+1]-x[m]));
cout”則拉格朗日分段線性插值為:”yyy1endl;
for(k=0;k=n-1;k++)
{
if(xxx[k])
{
m=k-1;
k=n-1;
}
}
if((xx-x[m])(x[m+1]-xx))m=m+1;
else m=m;
yy1=y[m-1]*((xx-x[m])*(xx-x[m+1]))/((x[m-1]-x[m])*(x[m-1]-x[m+1]));
yy2=y[m]*((xx-x[m-1])*(xx-x[m+1]))/((x[m]-x[m-1])*(x[m]-x[m+1]));
yy3=y[m+1]*((xx-x[m-1])*(xx-x[m]))/((x[m+1]-x[m-1])*(x[m+1]-x[m]));
yyy2=yy1+yy2+yy3;
cout”則拉格朗日分段二次插值為:”yyy2endl;
cout”是否輸入其餘要求x的值[是(1),否(0)]:”;
cinq;
}
system(“cls”);
}
void main()
{
lagrange();
}
拉格朗日差值多項式的c語言
function =lagrange(x1,y1,xx)
%本程序為Lagrange1插值,其中x1,y1
%為插值節點和節點上的函數值,輸出為插值點xx的函數值,
%xx可以是向量。
syms x
n=length(x1);
for i=1:n
t=x1;t(i)=[];L(i)=prod((x-t)./(x1(i)-t));% L向量用來存放插值基函數
end
u=sum(L.*y1);
p=simplify(u) % p是簡化後的Lagrange插值函數(字符串)
=subs(p,x,xx);
clf
plot(x1,y1,’ro’,xx,,’*’)
拉格朗日插值用c語言怎麼編程?各位高手幫幫忙啦
#includestdio.h
#includestring.h
#define N 100
typedef struct tag{
double x;
double y;
}POINT;
void main()
{
int i,j,n;
double x,temp,Ln=0;
POINT pt[N];
printf(“請輸入你要輸入點的個數,,1=n=%d:\n”,N);
printf(“n=”);
scanf(“%d”,n);
printf(“\n”);
printf(“\n請輸入對應的點數\n”);
for(i=0;in;i++)
scanf(“%lf,%lf”,pt[i].x,pt[i].y);
printf(“\n”);
printf(“輸入插值點x的值:\n”);
scanf(“%lf”,x);
printf(“\n”);
for(i=0;in;i++)
{
for(j=0,temp=1;jn;j++)
{
if(j!=i)
temp=temp*(x-pt[j].x)/(pt[i].x-pt[j].x);
}
Ln=Ln+temp*pt[i].y;
}
printf(“輸出:\nLn(%lf)=%lf\n”,x,Ln);
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/241435.html