数值分析 算法C语言程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、拉格朗日插值

#include

#include

#include

void Lagrange(float s)

{

double x[5]={0.2,0.4,0.6,0.8,1.0},y[5]={0.98,0.92,0.81,0.64,0.38},f,L=0;

int i,j;

for (i=0;i<5;i++)

{ f=1; for (j=0;j<5;j++) if(j!=i) f=(s-x[j])/(x[i]-x[j])*f; L+=f*y[i]; } printf("输出:%f\n",L);

}

void main()

{

float x;

printf("输入插值点:");

scanf("%f",&x);

Lagrange(x);

}

二、牛顿插值

#include

#include

#include

int ND(float s)

{

double x[5]={0.2,0.4,0.6,0.8,1.0},y[5]={0.98,0.92,0.81,0.64,0.38},p=0,g,f;

int i,j,k;

for (i=0;i<5;i++)

{

for (j=4;j>i;j--)

{ f=x[j]-x[j-i-1];y[j]=(y[j]-y[j-1])/f;}

g=y[i+1];

for (k=0;k<=i;k++)

g=g*(s-x[k]);

p=p+g;

}

printf("输出插值点函数值:%f\n",p+y[0]);

return 1;

}

void main()

{

float x;

printf("输入插值点:");

scanf("%f",&x);

ND(x);

}

三、埃尔米特插值

#include

#include

#include

void Hermite(float s)

{

double x[3]={0.25,1,2.25},y[3]={0.125,1,3.375},z[3]={0.75,1.5,2.25};

double H=0.0,a,b,f,g;

int i,j;

for (i=0;i<3;i++)

{

f=1.0;g=0.0;

for (j=0;j<3&&j!=i;j++)

{f=f*(s-x[j])/(x[i]-x[j]);g=g+1/(x[i]-x[j]);}

a=(1-2*(s-x[i])*g)*f*f;b=(s-x[i])*f*f;

H=H+y[i]*a+z[i]*b;

}

printf("%f\n",H);

}

void main()

{

float x;

printf("输入插值点:");

scanf("%f",&x);

Hermite(x);

}

四、三次样条插值

#include

#include

#include

void main()

{

int N=7,R=2,i,k;

double p1,p2,p3,p4;

double x[8]={0.5,0.7,0.9,1.1,1.3,1.5,1.7,1.9};

double y[8]={0.4794,0.6442,0.7833,0.8912,0.9636,0.9975,0.9917,0.9463};

double P0=-0.4794,Pn=-0.9463,u[3]={0.6,0.8,1.2},s[3];

double h[7],a[8],c[7], g[8],af[8],ba[7],m[8];

for(k=0;k

h[k]=x[k+1]-x[k];

for(k=1;k

for(k=1;k

for(k=1;k

c[0]=a[N]=1;

g[0]=3*(y[1]-y[0])/h[0]-P0*h[0]/2;

g[N]=3*(y[N]-y[N-1])/h[N-1]+Pn*h[N-1]/2;

ba[0]=c[0]/2; g[0]=g[0]/2;

for(i=1;i

{ af[i]=2-a[i]*ba[i-1]; g[i]=(g[i]-a[i]*g[i-1])/af[i]; ba[i]=c[i]/af[i]; }

af[N]=2-a[N]*ba[N-1];

g[N]=(g[N]-a[N]*g[N-1])/af[N];

m[N]=g[N];

for(i=N-1;i>=0;i--) m[i]=g[i]-ba[i]*m[i+1];

for(i=0;i <=R;i++)

{ k=0;

while(u[i]> x[k+1])

k++;

p1=(h[k]+2*(u[i]-x[k])*pow((u[i]-x[k+1]),2)*y[k])/pow(h[k],3);

p2=(h[k]-2*(u[i]-x[k+1])*pow((u[i]-x[k]),2)*y[k+1])/pow(h[k],3);

p3=(u[i]-x[k])*pow((u[i]-x[k+1]),2)*m[k]/pow(h[k],2);

p4=(u[i]-x[k+1])*pow((u[i]-x[k]),2)*m[k+1]/pow(h[k],2);

s[i]=p1+p2+p3+p4;

}

printf( "\nx= ");

for(i=0;i <=N;i++)

printf( "%8.1f ",x[i]);

printf( "\ny= ");

for(i=0;i <=N;i++)

printf( "%8.4f ",y[i]);

printf( "\n\nu= ");

for(i=0;i <=R;i++)

printf( "%9.2f ",u[i]);

printf( "\n插值点:s= ");

for(i=0;i <=R;i++)

相关文档
最新文档