用C语言编写一个线性插值程序

用C语言编写一个线性插值程序,第1张

#include <stdio.h>

double Lerp(double x0,double y0,double x1,double y1,double x)

{

    double dy = y1 - y0

    if(dy == 0){

        printf("除0错误!\n")

        return 0

    }

    return x * (x1 - x0) / dy

}

int main()

{

    double x0,x1,y1,y0,x,y

    printf("Inptu x0 y0 x1 y1 x:")

    scanf("%lf %lf %lf %lf %lf",&x0,&y0,&x1,&y1,&x)

    y = Lerp(x0,y0,x1,y1,x)

    printf("y = %lf\n",y)

    return 0

}

#include<stdio.h>

#include<stdlib.h>

#include<iostream.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次插值):"//获得插值次数

cin>>n

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=1j<=nj++)

{

t=(x-d[j-1].x)*t

yt=f(0,j)*t

//cout<<f(0,j)<<endl

y=y+yt

}

return y

}

float lagrange(float x,int count)

{

float y=0.0

for(int k=0k<countk++)//这儿默认为count-1次插值

{

float p=1.0//初始化p

for(int j=0j<countj++)

{//计算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组:"//要求用户输入数据组数

cin>>count

if(count<=20)

break//检查输入的是否合法

system("cls")

}

//获得各组数据

for(int i=0i<counti++)

{

cout<<"请输入第"<<i+1<<"组x的值:"

cin>>d[i].x

cout<<"请输入第"<<i+1<<"组y的值:"

cin>>d[i].y

system("cls")

}

cout<<"请输入x的值:"//获得变量x的值

cin>>x

while(1)

{

int choice=3

cout<<"请您选择使用哪种插值法计算:"<<endl

cout<<" (0):退出"<<endl

cout<<" (1):Lagrange"<<endl

cout<<" (2):Newton"<<endl

cout<<"输入你的选择:"

cin>>choice//取得用户的选择项

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

}

cout<<x<<" , "<<y<<endl//输出最终结果

}

问题补充,因字数限制,挪到这

1.拉格朗日插值简介:

对给定的n个插值节点x1,x2,…,xn,及其对应的函数值y1=f(x1), y2=f(x2),…, yn=f(xn)使用拉格朗日插值公式,计算在x点处的对应的函数值f(x)

2.一维拉格朗日插值c语言程序:

Int lagrange(x0, y0, n, x, y)

Float xo[], yo[], x

Int n

Float *y

{

Int i, j

Float p

*y=0

If (n>1)

{

For(i=0i<ni++)

{

P=1

For(j=1j<nj++)

{

If(i!=J)

P=p*(x-x0[j]/x0[i]-x0[j])

}

*y=*y+p*y0[i]

Return(0)

}

Else

Return(-1)

}

3.例题。已知函数如下表所示,求x=0.472处的函数值:

X 0.46 0.47 0.480.49

Y 0.484655 0.4903745 0.502750 0.511668

计算这个问题的c语言程序如下:

#minclude stdio

#includeM<nath.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”)

}

}

计算结果:Y(0.472)=:0.495553

4.问题补充

我的问题与上面的例子类似,计算三维空间一点(x,y,z)对应的函数值(Vx,Vy,Vz).不同的是自变量(point_coordinate.txt)为三维空间散乱点(不是正方体的顶点),因变量(point_data.txt)为矢量(向量 )。插值算法比较多,常数法,拉格朗日插值,埃特金插值,三阶样条插值等。最简单的就是常数法,查找离目标点(x,y,z)距离最近的已知自变量(Xi,Yi,Zi),把该点的函数值赋给目标点做函数值,求高手帮忙写写。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/8141695.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存