数值试验 主要包括高斯追赶法变步长拉格狼日牛顿.docx
- 文档编号:7390369
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:14
- 大小:17.36KB
数值试验 主要包括高斯追赶法变步长拉格狼日牛顿.docx
《数值试验 主要包括高斯追赶法变步长拉格狼日牛顿.docx》由会员分享,可在线阅读,更多相关《数值试验 主要包括高斯追赶法变步长拉格狼日牛顿.docx(14页珍藏版)》请在冰豆网上搜索。
数值试验主要包括高斯追赶法变步长拉格狼日牛顿
高斯
#include
#include
#defineN10
voidGauss(floata[][N+1],intn);
voidshow(floata[][N+1],intn);
voidmain()
{
//floata[4][5]={1,2,1,-2,-1,2,5,3,-2,3,-2,-2,3,5,15,1,3,2,5,9};
inti=0,j,n=0;
floata[N][N+1]={0};
boolflag=false;
printf("请输入一个增广矩阵,以“#”结束:
\n");
floatb[N*(N+1)];
while(!
flag)
{
scanf("%f",&b[i]);
while(getchar()!
='#')
{
i++;
scanf("%f",&b[i]);
}
n=int(sqrt(i));
if(i==n*(n+1))
flag=true;
else
{
printf("------输入矩阵不规范,重新输入:
-----\n");
i=0;
}
}
for(i=0;i for(j=0;j a[i][j]=b[i*(n+1)+j]; printf("起始矩阵: \n"); for(i=0;i for(j=0;j printf("%lf\t",a[i][j]); printf("\n"); } printf("-----------------------------\n\n"); Gauss(a,n); show(a,n); } voidGauss(floata[][N+1],intn) { for(intk=0;k { floatmax=0; intt=k; for(inti=k;i { if(max { max=a[i][k]; t=i; } } floatp; for(i=k;i { p=a[k][i]; a[k][i]=a[t][i]; a[t][i]=p; } p=a[k][k]; for(i=k;i { a[k][i]=a[k][i]/p; } for(i=k+1;i { p=a[i][k]; for(intj=k;j { a[i][j]-=p*a[k][j]; } } } for(k=n-2;k>=0;k--) for(intj=k+1;j { a[k][n]=a[k][n]-a[k][j]*a[j][n]; } } voidshow(floata[][N+1],intn) { printf("转换矩阵: \n"); for(inti=0;i for(intj=0;j printf("%lf\t",a[i][j]); printf("\n"); } printf("-----------------------------\n\n"); printf("结果集: \n"); for(i=0;i printf("\tX%d=%lf\n",i+1,a[i][n]); } 追赶 #include #include #defineN10 voidPresue(floata[][N+1],floatL[][N],floatU[][N],intn); voidShow(floata[][N+1],floatL[][N],floatU[][N],intn); voidmain() { //floata[4][5]={3,1,0,0,1,2,3,1,0,0,0,2,3,1,1,0,0,1,3,0},L[4][4]={0},U[4][4]={0}; floata[N][N+1]={0},L[N][N]={0},U[N][N]={0}; inti=0,j,n=0; boolflag=false; printf("请输入一个增广矩阵,以“#”结束: \n"); floatb[N*(N+1)]; while(! flag) { scanf("%f",&b[i]); while(getchar()! ='#') { i++; scanf("%f",&b[i]); } n=i/4+1; if(i==6+(n-2)*4) flag=true; else { printf("------输入矩阵不规范,重新输入: -----\n"); i=0; } } /*for(i=0;i<2;i++) scanf("%f",&a[0][i]); for(i=1;i<4;i++) for(j=i-1;j scanf("%f",&a[i][j]); printf("请输入方程的常数f: \n"); for(i=0;i<4;i++) scanf("%f",&a[i][4]);*/ for(i=0;i<2;i++) a[0][i]=b[i]; a[0][n]=b[2]; intt=3; for(i=1;i { for(j=i-1;j { a[i][j]=b[t]; t++; } a[i][n]=b[t]; t++; } printf("原推广矩阵为: \n"); for(i=0;i { for(j=0;j printf("%lf\t",a[i][j]); printf("\n"); } printf("---------------------\n"); Presue(a,L,U,n); Show(a,L,U,n); } voidPresue(floata[][N+1],floatL[][N],floatU[][N],intn) { inti; //Crout分解 L[0][0]=a[0][0]; U[0][0]=1; U[0][1]=a[0][1]/L[0][0]; for(i=1;i { L[i][i-1]=a[i][i-1]; L[i][i]=a[i][i]-L[i][i-1]*U[i-1][i]; U[i][i]=1; if((i+1) U[i][i+1]=a[i][i+1]/L[i][i]; } //求解Ly=f a[0][n]/=L[0][0]; for(i=1;i a[i][n]=(a[i][n]-L[i][i-1]*a[i-1][n])/L[i][i]; //求解Ux=y a[n-1][n]=a[n-1][n]; for(i=n-2;i>=0;i--) a[i][n]=a[i][n]-U[i][i+1]*a[i+1][n]; } voidShow(floata[][N+1],floatL[][N],floatU[][N],intn) { inti,j; printf("分解后L矩阵: \n"); for(i=0;i { for(j=0;j printf("%lf\t",L[i][j]); printf("\n"); } printf("---------------------\n"); printf("分解后U矩阵: \n"); for(i=0;i { for(j=0;j printf("%lf\t",U[i][j]); printf("\n"); } printf("---------------------\n"); printf("方程的解是: \n"); for(i=0;i { printf("X%d: %lf\n",i,a[i][n]); } } 拉格朗日 #include #defineN6 floatLagrange(floatX[],floatY[],intn,floatt); voidmain() { floatX[N]={0},Y[N]={0},p=0; inti=0,j=0,k=0; boolflag=true; printf("请输入条件,以'#'结束: \n"); while(flag) { scanf("%f",&p); while(getchar()! ='#') { if(i%2==0) X[j++]=p; else Y[k++]=p; i++; scanf("%f",&p); } if(i%2==0) flag=false; else { flag=true; i=0;j=0;k=0; printf("x与y不匹配,请重新输入: \n"); } } printf("请输入要求解的数: \n"); scanf("%f",&p); printf("---------f(%lf)=%lf\n",p,Lagrange(X,Y,i/2,p)); } floatLagrange(floatX[],floatY[],intn,floatt) { inti,j; floatl=1,sum=0; for(i=0;i { for(j=0;j { if(i==j) continue; else l*=(t-X[j])/(X[i]-X[j]); } sum+=l*Y[i]; l=1; } returnsum; } 牛顿 #include #defineN6 doubleNewton(doubleX[][N],intn,intp,doublet); voidmain() { doubleX[2][N]={0},p; inti=0,j=0,k=0; boolflag=true; printf("请输入条件,以'#'结束: \n"); while(flag) { scanf("%lf",&p); while(getchar()! ='#') { if(i%2==0) X[0][j++]=p; else X[1][k++]=p; i++; scanf("%lf",&p); } if(i%2==0) flag=false; else { flag=true; i=0;j=0;k=0; printf("x与y不匹配,请重新输入: \n"); } } printf("请输入要求解的数: \n"); scanf("%lf",&p); printf("f(%lf)=%lf\n",p,Newton(X,2,i/2,p)); } doubleNewton(doubleX[][N],intn,intp,doublet) { inti,j,k; doublet1,t3,t2=X[1][0]; for(i=1;i { t3=X[1][i-1]; for(j=i;j { t1=(X[1][j]-t3)/(X[0][j]-X[0][j-i]); t3=X[1][j]; X[1][j]=t1; } t3=1; for(k=0;k t3*=(t-X[0][k]); t2+=X[1][i]*t3; } returnt2; } 变步长 #include #include doublevarstep(doublea,doubleb,doubleeps); voidmain() { doublea=0,b=1,eps=0.000001; printf("请输入积分范围: \n"); scanf("%lf%lf",&a,&b); printf("请输入精度值: \n"); scanf("%lf",&eps); printf("sin(x)/x在(%lf,%lf)上的积分是: %lf\n",a,b,varstep(a,b,eps)); } doublevarstep(doublea,doubleb,doubleeps) { doublet1,t2,h,n=1,p; h=(b-a)/n; if(a==0) t1=h/2*(1+sin(b)/b); else t1=h/2*(sin(a)/a+sin(b)/b); p=1; while(p>=eps) { t2=0; for(inti=0;i t2+=h/2*(sin(a+(i+0.5)*h)/(a+(i+0.5)*h)); t2+=t1/2; n*=2.0; h/=2.0; p=fabs(t2-t1); t1=t2; } returnt2; } 龙贝格 #include #include doublef(doublex) { if(x==0) return1; else returnsin(x)/x; } doubleRomberg(doublea,doubleb,doublee) { doubleh=b-a; intk=0,j; doubleT[10][10]; T[0][0]=(f(a)+f(b))*h/2; for(k=1;;k++) { doubletemp=0; for(inti=1;i<=pow(2,k-1);i++) { temp+=f(a+(i-1.0/2)*h); } T[0][k]=1.0/2*(T[0][k-1]+h*temp); for(j=1;j<=3&&j<=k;j++) { T[j][k-j]=(pow(4,j)*T[j-1][k-j+1]-T[j-1][k-j])/(pow(4,j)-1); } if(fabs(T[j-1][k-j+1]-T[j-2][k-j+2])<=e) { returnT[j-1][k-j+1]; break; } else { h=h/2; } } } voidmain(void) { doublea,b,e; printf("输入积分范围: \n"); scanf("%lf%lf",&a,&b); printf("输入精度: \n"); scanf("%lf",&e); printf("sin(x)/x在范围(%lf,%lf)的积分是: %lf\n",a,b,Romberg(a,b,e)); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数值试验 主要包括高斯追赶法变步长拉格狼日牛顿 数值 试验 主要 包括 追赶 步长 拉格狼日 牛顿