拉格朗日插值法c语言函数 拉格朗日插值编程

拉格朗日差值多项式的c语言

function =lagrange(x1,y1,xx)

砀山网站制作公司哪家好,找创新互联!从网页设计、网站建设、微信开发、APP开发、自适应网站建设等网站项目制作,到程序开发,运营维护。创新互联自2013年起到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联

%本程序为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

#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语言怎么编程?各位高手帮帮忙啦

#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);

}

拉格朗日插值法用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语言函数 拉格朗日插值编程
网页路径:http://cdiso.cn/article/doiophd.html

其他资讯