新聞中心
拉格朗日插值法用C語(yǔ)言表示
我的程序是牛頓插值和拉格朗日插值合起來(lái),你自己看下,用的是C++
創(chuàng)新互聯(lián)建站專(zhuān)注于喀左企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,成都商城網(wǎng)站開(kāi)發(fā)。喀左網(wǎng)站建設(shè)公司,為喀左等地區(qū)提供建站服務(wù)。全流程按需策劃設(shè)計(jì),專(zhuān)業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)建站專(zhuān)業(yè)和態(tài)度為您提供的服務(wù)
#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"請(qǐng)輸入X的個(gè)數(shù):";
cinn;
for(k=0;k=n-1;k++)
{
cout"請(qǐng)輸入X"k"的值:";
cinx[k];
cout"請(qǐng)輸入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"請(qǐng)輸入所求x的值:";
cinxx;
while(xxx[k-1]||xxx[0])
{
cout"輸入錯(cuò)誤,請(qǐng)重新輸入:";
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();
}
高分懸賞 求三維數(shù)據(jù)點(diǎn)C語(yǔ)言插值計(jì)算程序
問(wèn)題補(bǔ)充,因字?jǐn)?shù)限制,挪到這
1.拉格朗日插值簡(jiǎn)介:
對(duì)給定的n個(gè)插值節(jié)點(diǎn)x1,x2,…,xn,及其對(duì)應(yīng)的函數(shù)值y1=f(x1), y2=f(x2),…, yn=f(xn);使用拉格朗日插值公式,計(jì)算在x點(diǎn)處的對(duì)應(yīng)的函數(shù)值f(x);
2.一維拉格朗日插值c語(yǔ)言程序:
Int lagrange(x0, y0, n, x, y)
Float xo[], yo[], x;
Int n;
Float *y
{
Int i, j;
Float p;
*y=0;
If (n1)
{
For(i=0;in;i++)
{
P=1;
For(j=1;jn;j++)
{
If(i!=J)
P=p*(x-x0[j]/x0[i]-x0[j]);
}
*y=*y+p*y0[i];
Return(0);
}
Else
Return(-1);
}
3.例題。已知函數(shù)如下表所示,求x=0.472處的函數(shù)值:
X 0.46 0.47 0.48 0.49
Y 0.484655 0.4903745 0.502750 0.511668
計(jì)算這個(gè)問(wèn)題的c語(yǔ)言程序如下:
#minclude stdio
#includeMnath.h
Main()
{
Float x0[4]={ 0.46, 0.47,0.48,0.49};
Float y0[4]={ 0.484655 ,0.4903745 ,0.502750 ,0.511668};
Float x, y;
Int n, rtn;
N=4;
X=0.472;
Rth=lagrange(x0,y0,n,x,y);
If(rtn=0)
{
Prinf(“Y(0.472)=:%f\n”,y);
}
Else
{
Prinf(“n must be larger than 1.\n”);
}
}
計(jì)算結(jié)果:Y(0.472)=:0.495553
4.問(wèn)題補(bǔ)充
我的問(wèn)題與上面的例子類(lèi)似,計(jì)算三維空間一點(diǎn)(x,y,z)對(duì)應(yīng)的函數(shù)值(Vx,Vy,Vz).不同的是自變量(point_coordinate.txt)為三維空間散亂點(diǎn)(不是正方體的頂點(diǎn)),因變量(point_data.txt)為矢量(向量 )。插值算法比較多,常數(shù)法,拉格朗日插值,埃特金插值,三階樣條插值等。最簡(jiǎn)單的就是常數(shù)法,查找離目標(biāo)點(diǎn)(x,y,z)距離最近的已知自變量(Xi,Yi,Zi),把該點(diǎn)的函數(shù)值賦給目標(biāo)點(diǎn)做函數(shù)值,求高手幫忙寫(xiě)寫(xiě)。
C語(yǔ)言拉格朗日插值法,求幫忙看一下程序哪里出錯(cuò)了,0 error但是運(yùn)行出不來(lái)結(jié)果……
ncludestdio.h
#includemath.h
#includestdlib.h
#includeiostream
int?main()
{
double?t,?z=0,?tmp;
double?x[12]?=?{?0,?8.8,?20.2,?30.0,?39.7,?48.9,?59.2,?70.0,?80.3,?90.3,?95.0,?100.0?};
double?y[12]?=?{?110.6,?106.1,?102.2,?98.6,?95.2,?92.1,?89.4,?86.8,?84.4,?82.3,?81.2,?80.2?};
t?=?45.0;
int?i,?j,?k,?p;
k?=?0;
p?=?12;
for?(i?=?k;?i??k?+?p;?i++)
{
tmp?=?1;
for?(j?=?k;?jp+k;?j++)
if?(j?==?i)//j=i??
tmp?=?tmp*(t?-?x[j])?/?(x[i]?-?x[j]);//j=i?x[i]?-?x[j]=0?0作為分母??
z?=?z?+?tmp*y[i];//z沒(méi)有初始化
}
//return?z;//遇到return?后面的就不會(huì)執(zhí)行
printf("%2.5f°C\n",?z);
return?0;
}
用C語(yǔ)言實(shí)現(xiàn)拉格朗日插值、牛頓插值、等距結(jié)點(diǎn)插值算法
#includestdio.h
#includestdlib.h
#includeiostream.h
typedef struct data
{
float x;
float y;
}Data;//變量x和函數(shù)值y的結(jié)構(gòu)
Data d[20];//最多二十組數(shù)據(jù)
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"請(qǐng)輸入n值(即n次插值):";//獲得插值次數(shù)
cinn;
if(n=count-1)// 插值次數(shù)不得大于count-1次
break;
else
system("cls");
}
//初始化t,y,yt。
float t=1.0;
float y=d[0].y;
float yt=0.0;
//計(jì)算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++)//這兒默認(rèn)為count-1次插值
{
float p=1.0;//初始化p
for(int j=0;jcount;j++)
{//計(jì)算p的值
if(k==j)continue;//判斷是否為同一個(gè)數(shù)
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"請(qǐng)輸入x[i],y[i]的組數(shù),不得超過(guò)20組:";//要求用戶(hù)輸入數(shù)據(jù)組數(shù)
cincount;
if(count=20)
break;//檢查輸入的是否合法
system("cls");
}
//獲得各組數(shù)據(jù)
for(int i=0;icount;i++)
{
cout"請(qǐng)輸入第"i+1"組x的值:";
cind[i].x;
cout"請(qǐng)輸入第"i+1"組y的值:";
cind[i].y;
system("cls");
}
cout"請(qǐng)輸入x的值:";//獲得變量x的值
cinx;
while(1)
{
int choice=3;
cout"請(qǐng)您選擇使用哪種插值法計(jì)算:"endl;
cout" (0):退出"endl;
cout" (1):Lagrange"endl;
cout" (2):Newton"endl;
cout"輸入你的選擇:";
cinchoice;//取得用戶(hù)的選擇項(xiàng)
if(choice==2)
{
cout"你選擇了牛頓插值計(jì)算方法,其結(jié)果為:";
y=Newton(x,count);break;//調(diào)用相應(yīng)的處理函數(shù)
}
if(choice==1)
{
cout"你選擇了拉格朗日插值計(jì)算方法,其結(jié)果為:";
y=lagrange(x,count);break;//調(diào)用相應(yīng)的處理函數(shù)
}
if(choice==0)
break;
system("cls");
cout"輸入錯(cuò)誤!!!!"endl;
}
coutx" , "yendl;//輸出最終結(jié)果
}
拉格朗日插值用c語(yǔ)言怎么編程?各位高手幫幫忙啦
#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("請(qǐng)輸入你要輸入點(diǎn)的個(gè)數(shù),,1=n=%d:\n",N);
printf("n=");
scanf("%d",n);
printf("\n");
printf("\n請(qǐng)輸入對(duì)應(yīng)的點(diǎn)數(shù)\n");
for(i=0;in;i++)
scanf("%lf,%lf",pt[i].x,pt[i].y);
printf("\n");
printf("輸入插值點(diǎn)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);
}
當(dāng)前名稱(chēng):c語(yǔ)言插值函數(shù)lag12 c語(yǔ)言插值函數(shù)庫(kù)
文章來(lái)源:http://fisionsoft.com.cn/article/docsjsi.html