数值计算C语言常用小程序.docx
《数值计算C语言常用小程序.docx》由会员分享,可在线阅读,更多相关《数值计算C语言常用小程序.docx(18页珍藏版)》请在冰豆网上搜索。
数值计算C语言常用小程序
1、秦九韶算法2、二分法3、拉格朗日插值4、埃特金算法5、复化梯形法
6、复化辛甫生算法7、二阶龙格库塔方法8、四阶龙格库塔方法 9、改进的欧拉方法 10、迭代法 11、埃特金加速方法:
12、牛顿迭代法 13、追赶法 14、雅克比迭代 15、蛋白质设计:
17高斯消去法:
1、秦九韶算法
P11.3利用秦九韶算法求多项式,在x=3时的值。
程序:
#include
#include
voidmain()
{floata[100],v,x;
intn,i,k;
scanf("%d%f",&n,&x);
for(i=0;i<=n;i++)
scanf("%f",&a[i]);
v=a[n];
k=1;
do
{v=x*v+a[n-k];
k=k+1;
}
while(k<=n);
printf("v=%f",v);}
运行结果:
2、二分法
P11.1用二分法求方程法x*x*x-x-1=0在[1,2]内的近似根,要求误差不超过
#include
#include
floatfun(float);
voidmain()
{floata,b,c,x,y,y1;
scanf("%f%f%f",&a,&b,&c);
y1=fun(a);
do
{x=(a+b)/2;
y=fun(x);
{if(y*y1>0)
a=x;
else
b=x;}}
while((b-a)>=c);
printf("%f,%f\n",x,y);
}
floatfun(floatm)
{floatn;
n=m*m*m-m-1;
return(n);
}
运行结果:
3、拉格朗日插值
程序:
#include
main()
{floata,b,t,x[100],y[100];
intn,i,j,k;
scanf("%f%d",&a,&n);
for(i=0;i<=n;i++)
scanf("%f%f",&x[i],&y[i]);
k=0;
b=0;
for(k=0;k<=n;k++)
{t=1;
for(j=0;j<=n;j++)
{if(j!
=k)
t=t*(a-x[j])/(x[k]-x[j]);}
b=b+t*y[k];
}
printf("%f\n",b);
}
4、埃特金算法
程序:
#include
#include
main()
{floata,b,c,x[100],y[100];
inti,j,n,k;
scanf("%d%f",&n,&a);
for(i=0;i<=n;i++)
scanf("%f%f",&x[i],&y[i]);
for(k=1;k<=n;k++)
{for(i=k;i<=n;i++)
y[i]=y[k-1]+(y[i]-y[k-1])*(a-x[k-1])/(x[i]-x[k-1]);}
printf("%f\n",y[n]);
}
5、复化梯形法
P95.9设,用复化梯形法求积分的近似值
程序:
#include
#include
doublefun(double);
voidmain()
{
doublea,b,h,s,x,y;
intn,k;
scanf("%lf%lf%d",&a,&b,&n);
h=(b-a)/n;
s=0;
x=a;
y=fun(x);
for(k=1;k<=n;k++)
{s=s+fun(x);
x=x+h;
s=s+fun(x);
}
s=(h/2)*s;
printf("s=%lf\n",s);
}
doublefun(doublem)
{doublen;
n=exp(-m)*sin(4*m)+1;
return(n);
}
运行结果:
6、复化辛甫生算法
P95.9设,用复化辛甫生法求积分的近似值
程序:
#include
#include
doublefun(double);
voidmain()
{
doublea,b,h,s,x,y;
intn,k;
scanf("%lf%lf%d",&a,&b,&n);
h=(b-a)/n;
s=0;
x=a;
y=fun(x);
for(k=1;k<=n;k++)
{s=s+fun(x);
x=x+h/2;
s=s+4*fun(x);
x=x+h/2;
s=s+fun(x);}
s=(h/6)*s;
printf("s=%lf\n",s);
}
doublefun(doublem)
{doublen;
n=exp(-m)*sin(4*m)+1;
return(n);
}
运行结果:
7、二阶龙格库塔方法
求解初值问题:
取h=0.2
程序:
#include
#include
floatfun(float,float);
voidmain()
{floath,x0,y0,x1,y1,k1,k2;
intn,N;
scanf("%f%f%f%d",&x0,&y0,&h,&N);
n=1;
for(n=1;n<=N;n++)
{x1=x0+h;
k1=fun(x0,y0);
k2=fun(x0+h/2,y0+h/2*k1);
y1=y0+h*k2;
printf("%f,%f\n",x1,y1);
x0=x1;y0=y1;}
}
floatfun(floata,floatb)
{floatm;
m=b-2*a/b;
return(m);
}
运行结果:
8、四阶龙格库塔方法
求解初值问题:
取h=0.2
程序:
#include
#include
floatfun(float,float);
voidmain()
{floath,x0,y0,x1,y1,k1,k2,k3,k4;
intn,N;
scanf("%f%f%f%d",&x0,&y0,&h,&N);
n=1;
for(n=1;n<=N;n++)
{x1=x0+h;
k1=fun(x0,y0);
k2=fun(x0+h/2,y0+h/2*k1);
k3=fun(x0+h/2,y0+h/2*k2);
k4=fun(x1,y0+h*k3);
y1=y0+h/6*(k1+2*k2+2*k3+k4);
printf("%f,%f",x1,y1);
x0=x1;y0=y1;}
}
floatfun(floata,floatb)
{floatm;
m=b-2*a/b;
return(m);
}
运行结果:
9、改进的欧拉方法
求解初值问题:
程序:
#include
#include
floatfun(float,float);
voidmain()
{floatx0,y0,h,x1,y1,yp,yc;
intn,N;
scanf("%f%f%f%d",&x0,&y0,&h,&N);
for(n=1;n<=N;n++)
{x1=x0+h;
yp=y0+h*fun(x0,y0);
yc=y0+h*fun(x1,yp);
y1=(yp+yc)/2;
printf("%f,%f",x1,y1);
x0=x1;
y0=y1;}
}
floatfun(floata,floatb)
{floatm;
m=b-2*a/b;
return(m);
}
运行结果:
10、迭代法
P131例2用迭代法求方程在附近的一个根,要求精度为
程序:
#include
#include
floatfun(float);
voidmain()
{floatx0,x1,c;
intk,N;
scanf("%f%f%d",&x0,&c,&N);
for(k=1;k<=N;k++)
{x1=fun(x0);
printf("%f\n",x1);
if(fabs(x1-x0) x0=x1;
}
if(k-1==N)
printf("Failure!
\n");
}
floatfun(floatm)
{floatn;
n=exp(-m);
return(n);
}
运行结果:
11、埃特金加速方法:
程序:
#include
#include
floatfun(float);
voidmain()
{floatx0,x1,x2,c;
intk,N;
scanf("%f%f%d",&x0,&c,&N);
for(k=1;k<=N;k++)
{x1=fun(x0);
x2=fun(x1);
x2=x2-(x2-x1)*(x2-x1)/(x2-2*x1+x0);
if(fabs(x2-x0) {printf("%f\n",x2);
break;}
x0=x2;
}
if(k-1==N)
printf("Failure!
\n");
}
floatfun(floatm)
{floatn;
n=exp(-m);
return(n);
}
运行结果:
12、牛顿迭代法:
例5、用牛顿法解方程
牛顿公式为:
,取x=0.5
程序:
#include
#include
floatfun(float);
floatff(float);
voidmain()
{floatx0,x1,c;
intk,N;
scanf("%f%f%d",&x0,&c,&N);
for(k=1;k<=N;k++)
{if(ff(x0)!
=0)
{x1=x0-fun(x0)/ff(x0);
printf("%f\n",x1);
if(fabs(x1-x0) x0=x1;}
else
printf("****");
}
if(k==N)
printf("Failure!
\n");
}
floatfun(floatm)
{floatn;
n=m-exp(-m);
return(n);
}
floatff(floatm)
{floatn;
n=1+m;
return(n);
}
运行结果:
13、追赶法:
P198.3.用追赶法求解下列方程组:
程序:
#include
#include
voidmain()
{floata[100],b[100],c[100],d[100],t;
inti,n;
scanf("%d",&n);
for(i=2;i<=n;i++)
scanf("%f",&a[i]);
for(i=1;i<=n;i++)
scanf("%f",&b[i]);