数值分析作业.docx
- 文档编号:7170787
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:15
- 大小:17.44KB
数值分析作业.docx
《数值分析作业.docx》由会员分享,可在线阅读,更多相关《数值分析作业.docx(15页珍藏版)》请在冰豆网上搜索。
数值分析作业
数值分析作业
专业:
电气与动力工程
学号:
姓名:
第二章插值法
//用拉格朗日插值多项式求函数近似值
#include
#include
#include
doubleLagrange(double*x,double*y,doublexx,intn)
{
inti,j;
double*a,yy=0.0;
a=(double*)malloc(n*sizeof(double));
for(i=0;i<=n-1;i++)
{
a[i]=y[i];
for(j=0;j<=n-1;j++)
if(j!
=i)
a[i]*=(xx-x[j])/(x[i]-x[j]);
yy+=a[i];
}
free(a);
returnyy;
}
voidmain()
{
doublex[4]={1.1275,1.1503,1.1735,1.1972};
doubley[4]={0.11910,0.13954,0.15932,0.17903};
doublexx=1.1300,yy;
doubleLagrange(double*,double*,double,int);
yy=Lagrange(x,y,xx,4);
printf("x=%f,y=%f\n",xx,yy);
//getch();
}
输出结果:
x=1.130000,y=0.121406
Pressanykeytocontinue
第三章函数逼近与快速傅里叶变换
//曲线拟合的最小二乘法
#include
#include
#include
voidmain()
{
inti;
double*a;
doublex[16]={1.36,1.49,1.73,1.81,1.95,2.16,2.28,2.48};
doubley[16]={14.094,15.069,16.844,17.378,
18.435,19.949,20.963,22.495};
double*Approx(double*,double*,int,int);
a=Approx(x,y,8,2);
for(i=0;i<=2;i++)
printf("a[%d]=%f\n",i,a[i]);
}
double*Approx(double*x,double*y,intm,intn)
{
double*c,*a;
inti,j,t;
doublepower(int,double);
double*ColPivot(double*,int);
c=(double*)malloc((n+1)*(n+2)*sizeof(double));
for(i=0;i<=n;i++)
{
for(j=0;j<=n;j++)
{
*(c+i*(n+2)+j)=0.0;
for(t=0;t<=m-1;t++)
*(c+i*(n+2)+j)+=power(i+j,x[t]);
}
*(c+i*(n+2)+n+1)=0.0;
for(j=0;j<=m-1;j++)
*(c+i*(n+2)+n+1)+=y[j]*power(i,x[j]);
}
a=ColPivot((double*)c,n+1);
returna;
}
double*ColPivot(double*a,intn)
{
inti,j,t,k;
double*x,*c,p;
x=(double*)malloc(n*sizeof(double));
c=(double*)malloc(n*(n+1)*sizeof(double));
for(i=0;i<=n-1;i++)
for(j=0;j<=n;j++)
*(c+i*(n+1)+j)=(*(a+i*(n+1)+j));
for(i=0;i<=n-2;i++)
{
k=i;
for(j=i+1;j<=n-1;j++)
if(fabs(*(c+j*(n+1)+i))>(fabs(*(c+k*(n+1)+i))))//找列主元
k=j;
if(k!
=i)
for(j=i;j<=n;j++)//交换
{
p=*(c+i*(n+1)+j);
*(c+i*(n+1)+j)=*(c+k*(n+1)+j);
*(c+k*(n+1)+j)=p;
}
for(j=i+1;j<=n-1;j++)//消元
{
p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i));
for(t=i;t<=n-1;t++)
*(c+j*(n+1)+t)-=p*(*(c+i*(n+1)+t));
*(c+j*(n+1)+n)-=p*(*(c+i*(n+1)+n));
}
}
for(i=n-1;i>=0;i--)//回代
{
for(j=n-1;j>=i+1;j--)
(*(c+i*(n+1)+n))-=x[j]*(*(c+i*(n+1)+j));
x[i]=*(c+i*(n+1)+n)/(*(c+i*(n+1)+i));
}
free(c);
returnx;
}
doublepower(inti,doublev)
{
doublea=1.0;
while(i--)
a*=v;
returna;
}
输出结果:
a[0]=4.976251
a[1]=6.314510
a[2]=0.300361
Pressanykeytocontinue
第四章数值积分和数值微分
//用复化辛普森公式计算积分
#include
#include
#include
voidmain()
{
inti,n=2;
doubles;
doublef(double);
doubleSimpson(double(*)(double),double,double,int);
for(i=0;i<=2;i++)
{
s=Simpson(f,0,1,n);
printf("s(%d)=%f\n",n,s);
n*=2;
}
}
doubleSimpson(double(*f)(double),doublea,doubleb,intn)
{
intk;
doubles,s1,s2=0.0;
doubleh=(b-a)/n;
s1=f(a+h/2);
for(k=1;k<=n-1;k++)
{
s1+=f(a+k*h+h/2);
s2+=f(a+k*h);
}
s=h/6*(f(a)+4*s1+2*s2+f(b));
returns;
}
doublef(doublex)
{
returnexp(-x);
}
输出结果:
s
(2)=0.632134
s(4)=0.632121
s(8)=0.632121
Pressanykeytocontinue
第五章解线性方程组的直接方法
//用列主元Gauss消去法
#include
#include
#include
#include
voidmain()
{
inti;
double*x;
doublec[3][4]={3,-1,4,7,
-1,2,-2,-1,
2,-3,-2,0};
double*ColPivot(double*,int);
x=ColPivot(c[0],3);
for(i=0;i<=2;i++)//输出方程组的解
printf("x[%d]=%f\n",i,x[i]);
getch();
}
double*ColPivot(double*c,intn)
{
inti,j,t,k;
double*x,p;
x=(double*)malloc(n*sizeof(double));
for(i=0;i<=n-2;i++)
{
k=i;
for(j=i+1;j<=n-1;j++)
if(fabs(*(c+j*(n+1)+i))>(fabs(*(c+k*(n+1)+i))))//找列主元
k=j;
if(k!
=i)
for(j=i;j<=n;j++)//交换
{
p=*(c+i*(n+1)+j);
*(c+i*(n+1)+j)=*(c+k*(n+1)+j);
*(c+k*(n+1)+j)=p;
}
for(j=i+1;j<=n-1;j++)//消元
{
p=(*(c+j*(n+1)+i))/(*(c+i*(n+1)+i));
for(t=i;t<=n;t++)
*(c+j*(n+1)+t)-=p*(*(c+i*(n+1)+t));
}
}
for(i=n-1;i>=0;i--)//回代
{
for(j=n-1;j>=i+1;j--)
(*(c+i*(n+1)+n))-=x[j]*(*(c+i*(n+1)+j));
x[i]=*(c+i*(n+1)+n)/(*(c+i*(n+1)+i));
}
returnx;
}
输出结果:
x[0]=2.000000
x[1]=1.000000
x[2]=0.500000
第六章解线性方程组的迭代法
//用雅可比迭代法解方程组
#include
#include
#include
#include
#defineEPS1e-6
#defineMAX100
double*Jacobi(doublea[3][4],intn)
{
double*x,*y,epsilon,s;
inti,j,k=0;
x=(double*)malloc(n*sizeof(double));
y=(double*)malloc(n*sizeof(double));
for(i=0;i<=n;i++)
x[i]=0;
while
(1)
{
epsilon=0;
k++;
for(i=0;i { s=0; for(j=0;j { if(j==i) continue; s+=a[i][j]*x[j]; } y[i]=(a[i][n]-s)/a[i][i]; epsilon+=fabs(y[i]-x[i]); } if(epsilon { printf("迭代次数为: %d\n",k); returny; } if(k>=MAX) { printf("Themethodisdisconvergent"); returny; } for(i=0;i x[i]=y[i]; } } voidmain() { inti; doublea[3][4]={5,2,1,-12,-1,4,2,20,2,-3,10,3}; double*x; x=(double*)malloc(3*sizeof(double)); x=Jacobi(a,3); for(i=0;i<3;i++) printf("x[%d]=%f\n",i,x[i]); getch(); } 输出结果: 迭代次数为: 25 x[0]=-4.000000 x[1]=3.000000 x[2]=2.000000 第七章非线性方程与方程组的数值解法 //用牛顿迭代法求方程的根 #include #include #include #defineeps1e-3 #definen100 #defineeta1e-8 floatnewton(float(*f)(float),float(*f1)(float),floatx0) { floatx1,d; intk=0; do { x1=x0-f(x0)/f1(x0); if((k++>n)||(fabs(f1(x1)) { printf("\nnewtonmethodfailed"); getch(); } d=(fabs(x1)<1? x1-x0: (x1-x0)/x1); x0=x1; printf("x(%d)=%f\t",k,x0); } while((fabs(d))>eps&&fabs(f(x1))>eta); returnx1; } floatf(floatx) { returnx*x*x-3*x-1; } floatf1(floatx) { return3*x*x+3; } main() { floatf(float); floatf1(float); floatx0,y0; floatnewton(float(*)(float),float(*)(float),float); printf("pleaseinputx0\n"); scanf("%f",&x0); printf("x(0)=%f\n",x0); y0=newton(f,f1,x0); printf("\ntherootoftheequationisx=%f\n",y0); getch(); return(0); } 输出结果: pleaseinputx0 1.5 x(0)=1.500000 x (1)=1.717949x (2)=1.809359x(3)=1.848718x(4)=1.865897x(5)=1.873442 x(6)=1.876764x(7)=1.878229 therootoftheequationisx=1.878229 第八章矩阵特征值计算 //求矩阵的主特征值及特征向量的幂法 #include #include #include #defineN3 #defineEPS1e-6 #defineKM30 doublePowerMethod(double*A) { doubleMaxValue(double*,int); doubleU[N],V[N],r2,r1; doubletemp; inti,j,k=0; for(i=0;i U[i]=1; while(k { k++; for(i=0;i { temp=0; for(j=0;j V[i]=temp; } for(i=0;i U[i]=V[i]/MaxValue(V,N); if(k==1) r1=MaxValue(V,N); r2=MaxValue(V,N); if(fabs(r2-r1) r1=r2; } printf("\nr=%f",r2); for(i=0;i printf("\nx[%d]=%f\n",i+1,U[i]); return(0); } doubleMaxValue(double*x,intn) { doubleMax=x[0]; inti; for(i=1;i if(fabs(x[i])>fabs(Max))Max=x[i]; returnMax; } voidmain() { doubleA[N][N]={{2,-1,0},{-1,2,-1},{0,-1,2}}; PowerMethod(A[0]); } 输出结果: r=1.000000 x[1]=1.000000 x[2]=0.000000 x[3]=1.000000 Pressanykeytocontinue 第九章常微分方程初值问题数值解法 //用改进欧拉方法求解一阶常微分方程初值问题 #include #defineN5 voidModEuler(double(*f1)(double,double), doublex0,doubley0,doublexn,intn) { inti; doubleyp,yc,x=x0,y=y0,h=(xn-x0)/n; printf("x[0]=%f\ty[0]=%f\n",x,y); for(i=1;i<=n;i++) { yp=y+h*f1(x,y); x=x0+i*h; yc=y+h*f1(x,yp); y=(yp+yc)/2.0; printf("x[%d]=%f\ty[%d]=%f\n",i,x,i,y); } } voidmain() { doublexn=0.5,x0=0.0,y0=1.0; voidModEuler(double(*)(double,double),double,double,double,int); doublef1(double,double); ModEuler(f1,x0,y0,xn,N); } doublef1(doublex,doubley) { returnx*x-y*y; } 输出结果: x[0]=0.000000y[0]=1.000000 x[1]=0.100000y[1]=0.910000 x[2]=0.200000y[2]=0.836800 x[3]=0.300000y[3]=0.778584 x[4]=0.400000y[4]=0.734350 x[5]=0.500000y[5]=0.703636 Pressanykeytocontinue
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数值 分析 作业