计算方法程序集及例程
数值计算方法程序

数值计算方法程序本文将介绍几种常见的数值计算方法,包括二分法、牛顿法和迭代法。
二分法是一种通过不断将区间一分为二来逼近根的方法。
具体步骤如下:1.确定一个区间[a,b],使得函数在这个区间内有一个根。
2.计算区间的中点c=(a+b)/2,并计算函数在c处的值f(c)。
3.若f(c)为0,则c为函数的一个根;若f(c)>0,则表明根在区间[a,c]内,将b设为c,然后重复步骤2;若f(c)<0,则表明根在区间[c,b]内,将a设为c,然后重复步骤2牛顿法是一种通过不断迭代来逼近根的方法。
具体步骤如下:1.选择一个初始点x0。
2.计算函数在x0处的导数f'(x0)。
3.计算切线的斜率k=f'(x0),并求得切线与x轴的交点x1=x0-f(x0)/f'(x0)。
4.若x1与x0的差值小于给定的精度,则x1为函数的一个根;否则,将x1设为新的初始点,然后重复步骤2迭代法是一种通过不断迭代逼近函数的不动点的方法。
具体步骤如下:1.选择一个初始点x0。
2.计算x1=f(x0)。
3.若x1与x0的差值小于给定的精度,则x1为函数的一个不动点;否则,将x1设为新的初始点,然后重复步骤2除了上述介绍的数值计算方法,还有梯度下降法、高斯-赛德尔迭代法等方法可以用来解决数学问题。
在编写数值计算方法的程序时,需要注意以下几点:1.特殊情况的处理:例如,函数在一些点上可能发散或者不存在,需要对这些情况进行判断和处理。
2.收敛性的判断:需要设置一个收敛判据,当求得的近似解与真实解的差值小于给定的误差限时,认为已经达到了收敛。
3.算法的优化:可以通过调整参数、改变迭代步长等方式来提高算法的效率和精度。
4.可视化:可以通过绘制函数图像或者绘制迭代收敛曲线等方式来直观地展示计算过程和结果。
总之,数值计算方法是一种通过近似的方式来求解数学问题的方法,具有较好的适用性和实现性。
编写数值计算方法的程序时需要考虑特殊情况的处理、收敛性的判断、算法的优化和可视化等因素。
计算方法及程序实现刘华蓥第七章算法

计算方法及程序实现刘华蓥第七章算法刘华蓥的第七章算法是一种计算方法,主要用于解决复杂的数学问题,如线性方程组、方程求根、积分、微分等等。
这种算法综合了数值计算和近似计算的思想,能够在计算机上进行高效的求解。
在实现刘华蓥第七章算法的程序时,可以按照以下步骤进行:1.确定问题:首先需要明确需要解决的问题是什么,比如线性方程组的求解、方程求根、积分或微分等。
这将决定算法的具体实现方式。
2.设计算法:根据问题的特点,设计算法的流程和步骤。
可以参考刘华蓥第七章算法中的描述和示例。
3.编写代码:使用适当的编程语言,根据算法的设计将其转化为具体的代码。
根据具体问题的要求,可能需要使用不同的数据结构和算法库。
4.调试和优化:运行代码并进行调试,判断是否得到了正确的结果。
如果出现错误,可以使用调试工具定位和修复问题。
同时,也可以对代码进行优化,提高程序的性能和效率。
5.测试和验证:使用不同的测试用例来验证程序的正确性和健壮性。
可以对已知答案的问题进行求解,比较计算结果和预期结果是否一致。
下面以求解线性方程组为例,展示刘华蓥第七章算法的实现过程:问题:给定一个线性方程组Ax=b,其中A是一个n维矩阵,b是一个n维向量,求解x。
算法实现步骤:1.输入A和b。
2.判断A是否为方阵,如果不是则终止程序,并给出错误提示。
3.判断A是否为可逆矩阵,如果不是则终止程序,并给出错误提示。
4.使用高斯消元法将方程组转化为上三角方程组。
5.使用回代法求解上三角方程组,得到解x。
6.输出x。
代码实现(以Python为例):```pythonimport numpy as npdef solve_linear_equations(A, b):n = len(A)#判断A是否为方阵if len(A[0]) != n:print("A不是方阵")return None#判断A是否为可逆矩阵if np.linalg.det(A) == 0:print("A不是可逆矩阵")return None#高斯消元法for i in range(n):#将主元归一化pivot = A[i][i]A[i] = A[i] / pivotb[i] = b[i] / pivot#消元操作for j in range(i + 1, n):factor = A[j][i]A[j] = A[j] - A[i] * factorb[j] = b[j] - b[i] * factor#回代法x = np.zeros(n)for i in range(n - 1, -1, -1):x[i]=b[i]for j in range(i + 1, n):x[i]=x[i]-A[i][j]*x[j]return x#测试代码A = np.array([[2, 1, -1], [4, 1, 0], [-2, 1, 2]])b = np.array([2, 5, 3])x = solve_linear_equations(A, b)print(x) # 输出[-1. 3. 1.]```以上代码实现了刘华蓥第七章算法中求解线性方程组的部分。
计算方法(各种方法的程序源代码)

第一章求根公式法:#include<stdio.h>#include<math.h>main(){int a,b,c;double x1,x2,d=0.0;printf("请输入a,b,c的值:\n");scanf("%d,%d,%d",&a,&b,&c);d=b*b-4*a*c;if(d>=0){if(d>0){x1=(-b+sqrt(d))/(2*a);x2=(-b-sqrt(d))/(2*a);printf("方程的两根为x1=%f,x2=%f\n",x1,x2);}else{ x1=-b/(2*a);x2=x1;printf("方程的两根为x1=%f,x2=%f\n",x1,x2);}}else{printf("方程无实根\n");}return 0;}二分法:#include<stdio.h>#include<math.h>double f(double x){double y;y=x*x*x-2*x-5;return y;}main(){double a=2.0,b=3.0,x;if(f(a)*f(b)<0.0){do{x=(a+b)/2.0;if(f(a)*f(x)<0.0){b=x;continue;}if(f(x)*f(b)<0.0)a=x;}while(fabs(a-b)>0.01);}else printf("没有实根");printf("实根为%f",x);return 0;}第二章拉格朗日插值:#include <iostream>#include <iomanip>#include <stdlib.h>using namespace std;#define N 100void lagrange(){int n,k,m,q=1;float x[N],y[N],xx,yyy1,yyy2,yy1,yy2,yy3;cout<<"请输入X的个数:";cin>>n;for(k=0;k<=n-1;k++){cout<<"请输入X"<<k<<"的值:";cin>>x[k];cout<<"请输入Y"<<k<<"的值:";cin>>y[k];}system("cls");cout<<"则Xi与Yi表格如下:"<<endl;cout<<"Xi"<<"";for(k=0;k<=n-1;k++)cout<<setiosflags(ios::left)<<setw(10)<<x[k]; cout<<endl;cout<<"Yi"<<"";for(k=0;k<=n-1;k++)cout<<setiosflags(ios::left)<<setw(10)<<y[k]; cout<<endl;while(q){cout<<"请输入所求x的值:";cin>>xx;while(xx>x[k-1]||xx<x[0]){cout<<"输入错误,请重新输入:";cin>>xx;}for(k=0;k<=n-1;k++){if(xx<x[k]){m=k-1;k=n-1;}}yyy1=y[m]*((xx-x[m+1])/(x[m]-x[m+1]))+y[m+1]*((xx-x[m])/(x[m+1]-x[m] ));cout<<"则拉格朗日分段线性插值为:"<<yyy1<<endl;for(k=0;k<=n-1;k++){if(xx<x[k]){m=k-1;k=n-1;}}if((xx-x[m])>(x[m+1]-xx))m=m+1;else m=m;yy1=y[m-1]*((xx-x[m])*(xx-x[m+1]))/((x[m-1]-x[m])*(x[m-1]-x[m+1])); yy2=y[m]*((xx-x[m-1])*(xx-x[m+1]))/((x[m]-x[m-1])*(x[m]-x[m+1])); yy3=y[m+1]*((xx-x[m-1])*(xx-x[m]))/((x[m+1]-x[m-1])*(x[m+1]-x[m])); yyy2=yy1+yy2+yy3;cout<<"则拉格朗日分段二次插值为:"<<yyy2<<endl;cout<<"是否输入其余要求x的值[是(1),否(0)]:";cin>>q;}system("cls");}void main(){lagrange();}牛顿插值:#include<stdio.h>#include<math.h>main(){float a[]={0,1,2,3,4},b[]={3,6,11,18,27};float f[5],x,t,m,n,s=0;int i,j,k,l;printf("请输入x的值:");scanf("%f",&x);f[0]=b[0];for(i=1;i<5;i++){m=0;for(j=0;j<=i;j++){t=1;for(k=0;k<=i;k++){if(k!=j) t=t/(a[j]-a[k]);}m=m+b[j]*t;}n=1;for(l=0;l<i;l++) n=n*(x-a[l]);s=s+m*n;}s=s+f[0];printf("s=%f",s);return 0;}线性和二次插值法:#include<stdio.h>#include<math.h>main(){floata[]={0.4,0.5,0.6,0.7,0.8,0.9},b[]={-0.916291,-0.693147,-0.510826,-0.3566 75,-0.223144,-0.105361};float x,t,m,p1=0.0,p2=0.0,p3=0.0;int i,j;printf("请输入x的值");scanf("%f",&x);for(i=0;i<2;i++){t=0.0;for(j=0;j<2;j++){if(j!=i) t=t+((x-a[j])/(a[i]-a[j]))*b[i];}p1=p1+t;}printf("线性插值的结果为:%f",p1);for(i=0;i<3;i++){m=1.0;for(j=0;j<3;j++){if(j!=i) m=m*((x-a[j])/(a[i]-a[j]));}p2=p2+m*b[i];}printf("取0.4,0.5,0.7,的二次插值的结果为:%f",p2); for(i=1;i<4;i++){m=1.0;for(j=1;j<4;j++){if(j!=i) m=m*((x-a[i])/(a[i]-a[j]));}p3=p3+m*b[i];}printf("取0.5,0.6,0.7的二次插值的结果为:%f",p3);return 0;}直线拟合法:#include<stdio.h>#include<math.h>main(){float X[5]={-2,-1,0,1,2},Y[5]={0,0.2,0.5,0.8,1.0}; float a=0,b=0,c=0,d=0,m,n;int i;for(i=0;i<5;i++){a=a+X[i];b=b+Y[i];c=c+X[i]*X[i];d=d+X[i]*Y[i];};m=(b*c-a*d)/(5*c-a*a);n=(5*d-c*a)/(5*c-a*a);float x,y;printf("请输入X的值");scanf("%f",&x);y=m+n*x;printf("拟合后代入x的值得出的结果为:%f",y); return 0;}第三章复化辛甫生算法:#include<stdio.h>#include<math.h>float f(float x){float y;y=3*x*x+2*x;return y;}main(){float a,b,h,s;int k=1,n;printf("请输入a,b,n");scanf("%f,%f,%d",&a,&b,&n);h=(b-a)/n;s=f(b)-f(a);for(float x=a;k<n;k++){x=x+h/2;s=s+4*f(x);x=x+h/2;s=s+2*f(x);}s=(h/6)*s;printf("s=%f",s);}龙贝格算法:#include<stdio.h>#include<string.h>#include<math.h>#include<conio.h>#include<stdlib.h>float f(float x){return (2*x);}float r(float a,float b){int k=1;float s,x,t1,t2,s1,s2,c1,c2,r1,r2,h=b-a,p;t1=h*(f(a)+f(b))/2;while(1){s=0;x=a+h/2;do{s+=f(x);x+=h;}while(x<b);t2=(t1+h*s)/2.0;if(fabs(t2-t1)<p)return(t2);s2=t2+(t2-t1)/3.0;if(k==1){t1=t2;s1=s2;h/=2;k+=1;continue;}c2=s2+(s2-s1)/15.0;if(k==2){c1=c2;t1=t2;s1=s2;h/=2.0;k+=1;continue;}r2=c2+(c2-c1)/63;if(k==3){r1=r2;c1=c2;t1=t2;s1=s2;h/=2;k+=1;continue;};if(fabs(s1-s2)<p)return(s2);r1=r2;c1=c2;t1=t2;s1=s2;h/2;k+=1;return(r1);}}main(){int i;float a,b,p,s,clrsca();printf("\n input integrate f(x) the begin:");scanf("%f",&a);printf("\n input integrate f(x) the end:"); scanf("%f",&b);printf("\n input p:");scanf("%f",&p);s=r(a,b);printf("the result is:%f",s);getch();return(s);}变步长积分法:#include<stdio.h>#include<math.h>void main(){double k,a,b;int kk,n;double sum[100],t[100];printf("方程为f(x)=x/(4+x^2),积分区间为[0,1]\n");printf("请输入预定精度a的值\n");scanf("%lf",&a);t[0]=0.1;t[1]=0.1088;for(k=1.0,kk=1;fabs(t[kk]-t[kk-1])>=a;k++,kk++){for(n=1,sum[kk+1]=0;n<=pow(2.0,k);n++){b=(2*n-1)/pow(2.0,k+1);sum[kk+1]+=b/(4+b*b);}t[kk+1]=0.5*t[kk]+(1/pow(2.0,k+1))*sum[kk+1];}printf("\n方程利用变步长梯形法积分后的积分值为%f\n",t[kk]);}第四章:欧拉法:#include<stdio.h>#include<math.h>#include<string.h> #include<stdlib.h> float f(float x,float y){ float f;f=x+y;return f;};main(){float x[6],y[6],h;int n;printf("请输入x[0],y[0],h的值:");scanf("%f%f%f",&x[0],&y[0],&h);for(n=1;n<6;x[0]=x[n],y[0]=y[n],n++){ x[n]=x[0]+h;y[n]=y[0]+h*f(x[0],y[0]);printf("%f,%f",x[n],y[n]);printf("\n");}return 0;}改进欧拉法:#include<stdio.h>#include<math.h>#include<string.h>#include<stdlib.h>float f(float x,float y){float f;f=x+y;return f;};main(){float x[6],y[6],h,yp,ye;int n;printf("请输入x[0],y[0],h的值:");scanf("%f%f%f",&x[0],&y[0],&h);for(n=1;n<6;x[0]=x[n],y[0]=y[n],n++){ x[n]=x[0]+h;yp=y[0]+h*f(x[0],y[0]);ye=y[0]+h*f(x[n],yp);y[n]=(yp+ye)/2;printf("%f,%f",x[n],y[n]);printf("\n");}return 0;}四阶龙格库塔法:#include<stdio.h>#include<math.h>#include<string.h>float f(float x,float y){float f;f=x+y;return f;}main(){float x[11],y[11],h,k1,k2,k3,k4;printf("请分别输入x[0],y[0],h的值:");scanf("%f%f%f",&x[0],&y[0],&h);for(int n=1;n<11;x[0]=x[n],y[0]=y[n],n++){ x[n]=x[0]+h;k1=f(x[0],y[0]);k2=f(x[0]+h/2,y[0]+h*k1/2);k3=f(x[0]+h/2,y[0]+h*k2/2);k4=f(x[n],y[0]+h*k3);y[n]=y[0]+h*(k1+2*k2+2*k3+k4)/6;printf("%f,%f",x[n],y[n]);printf("\n");}return 0;}第六章迭代法:#include<stdio.h>#include<math.h>#include<string.h>double F1(double x);double Newton(double x0, double e); int main(){double x0 = 0.5;double e = 10E-6;printf("x = %f\n", Newton(x0, e));getchar();return 0;}double F1(double x){return log(x+2)/log(10);}double Newton(double x0, double e) {double x1;do{x1 = x0;x0 =F1(x1);} while (fabs(x0 - x1) > e);return x0;}埃特金加速法:#include<stdio.h>#include<conio.h>#include<math.h>#define h 1.E-10 double f(double x0) {x0=exp(-x0);return x0;}double sub(double x) {if(x>=0)return x;else return -x;}main(){double x0=0.5,x,s=0.0; do{x=f(x0);s=sub(x-x0);x0=x;}while(s>h); printf("x=%f",x); getch();return 0;}快速弦截法:#include<stdio.h>#include <math.h>float f(float x){float y;y=x*exp(x)-1;return (y);}float xpoint(float x1,float x2){float y;y=(x1*f(x2)-x2*f(x1)) / (f(x2) - f(x1));return (y) ;}float root(float x1, float x2) {int i;float x,y,y1;y1=f(x1);do{x=xpoint(x1,x2);y=f(x);if(y*y1>0){y1=y;x1=x;}elsex2=x;}while(fabs(y)>=0.0000001); return (x);}main(){float x1,x2,f1,f2,x;do{printf("input x1,x2:\n");scanf("%f,%f",&x1,&x2);f1=f(x1);f2=f(x2);}while(f1*f2>=0);x=root(x1,x2);printf("A root of equation is %8.4f\n",x); }第七章高斯消去法:#include<stdio.h>#include<math.h>main(){float a[10][10],b[10],m[10][10],x[10],sum; int i,j,k,n;printf("the top exp:");scanf("%d",&n);printf("\n");for(i=0;i<n;i++){for(j=0;j<n;j++){scanf("%f",&a[i][j]);}for(i=0;i<n;i++){scanf("%f",&b[i]);}for(k=0;k<n-1;k++){if(a[k][k]==0)printf("error");else {for(i=k+1;i<n;i++){m[i][k]=a[i][k]/a[k][k];} };a[i][k]=m[i][k];b[i]=b[i]-m[i][k]*b[k];for(j=k+1;j<n;j++)a[i][j]=a[i][j]-m[i][k]*a[k][j];};if(a[n-1][n-1]==0)printf("error");else x[n-1]=b[n-1]/a[n-1][n-1];b[n-1]=x[n-1];for(i=n-2;i>=0;i--){sum=0;for(j=i+1;j<n;j++){sum+=a[i][j]*x[j];}x[i]=(b[i]-sum)/a[i][i];b[i]=x[i];}for(i=0;i<n;i++)printf("%f\n",x[i]);}return 0;}选主元消去法:#include<stdio.h>#include<math.h>main(){float a[10][10],b[10],s,t,e,sum; int i,j,k,n,m;printf("The top exp is "); scanf("%d",&n);for(i=0;i<n;i++)for(j=0;j<n;j++)scanf("%f",&a[i][j]);for(i=0;i<n;i++)scanf("%f",&b[i]);scanf("%f",&e);k=0;do{t=a[k][k];for(i=k;i<n;i++){if(fabs(t)<fabs(a[i][k])){t=a[i][k];m=i;}else m=k;}if(fabs(t)<e)printf("det A = 0\n");else {if(m!=k){for(j=0;j<n;j++){s=a[m][j];a[m][j]=a[k][j];a[k][j]=s;}s=b[m];b[m]=b[k];b[k]=s;}for(i=k+1;i<n;i++)for(j=k+1;j<n;j++){a[i][k]=a[i][k]/a[k][k];a[i][j]=a[i][j]-a[i][k]*a[k][j];b[i]=b[i]-a[i][k]*b[k];}}k++;}while(k<n-2);if(fabs(a[n-1][n-1])<e)printf("det A = 0\n");else {b[n-1]=b[n-1]/a[n-1][n-1];for(i=n-2;i>=0;i--){sum=0;for(k=i+1;k<n;k++){sum+=a[k][j]*b[j];}b[i]=(b[i]-sum)/a[i][i];}}for(i=0;i<n;i++)printf("%f\n",b[i]);}追赶法:#include<stdio.h>#include<math.h>main(){int i,j,k,n;float d[10][10],g[10],a[10],b[10],c[10],x[10],y[10],f[10];printf("the top exp is ");scanf("%d",&n);scanf("%f,%f,%f,%f",&d[0][0],&d[0][1],&d[n-1][n-2],&d[n-1][n-1]); for(i=1;i<n-1;i++)for(j=i-1;j<=i+1;j++)scanf("%f",&d[i][j]);for(i=0;i<n;i++)scanf("%f",&g[i]);for(i=1;i<n-1;i++)a[i]=d[i][i-1];for(i=0;i<n;i++)b[i]=d[i][i];for(i=0;i<n-1;i++)c[i]=d[i][i+1];f[0]=c[0]/b[0];for(k=1;k<n-1;k++)f[k]=c[k]/(b[k]-a[k]*f[k-1]);y[0]=g[0]/b[0];for(i=1;i<n;i++)y[i]=(g[i]-a[i]*y[i-1])/(b[i]-a[i]*f[i-1]); x[n-1]=y[n-1];for(i=n-2;i>=0;i--)x[i]=y[i]-f[i]*x[i+1];for(i=0;i<n;i++)printf("%f\n",x[i]);}。
数值分析计算方法程序汇总

(一)复化梯形公式例:求121?x dx -=⎰程序:#include "stdio.h"void main(){double a,b,s,h,x;int i,n;a=-1.0;b=1.0;n=10;h=(b-a)/n;x=a;s=x*x/2;for(i=1;i<n;i++){x=x+h;s=s+x*x;}s=s+b*b/2;s=s*h;printf("s=%f\n",s);}结果:s=0.680000(二)复化辛普森公式例:求130?x dx=⎰程序:#include "stdio.h"void main(){double a,b,c,s,h,x,y;int i,n;a=0.0;b=1.0;n=10;s=0.0;h=(b-a)/n;x=a;y=x+h;c=(x+y)/2;for(i=1;i<=n;i++){s=s+x*x*x+4*c*c*c+y*y*y;x=x+h;y=y+h;c=c+h;}s=s*h/6;printf("s=%f\n",s);}结果:s=0.250000(三)复化高斯公式例:求220?x dx=⎰程序:#include <stdio.h>#include <math.h>main(){double a,b,h,s,x1,x2;int i,n;a=0;b=2;n=20;s=0;h=(b-a)/n;for(i=0;i<n;i++){x1=a+i*h+h/2*(1/1.732+1); x2=a+i*h+h/2*(1-1/1.732); s=s+x1*x1*x1+x2*x2*x2; }s=h/2*s;printf("s=%f\n",s);}结果:s=4.000000(四)迭代法例:求x=x2的解。
程序:#include "stdio.h"#include<math.h>main(){double x,xl,y,yl;int i,j;x=0.5;xl=x;y=0.5;yl=y;for(i=0;;i++){x=x*x;if(fabs(xl-x)<0.0001)break;else xl=x;}for(j=0;;j++){y=sqrt(y);if(fabs(yl-y)<0.0001)break;else yl=y;printf("x=%f,y=%f\n",x,y);}结果:x=0.000000,y=0.999915(五)牛顿迭代法y=f(x),求f(x*)=0。
(完整版)非常全的C语言常用算法

一、基本算法1.交换(两量交换借助第三者)例1、任意读入两个整数,将二者的值交换后输出。
main(){int a,b,t;scanf("%d%d",&a,&b);printf("%d,%d\n",a,b);t=a; a=b; b=t;printf("%d,%d\n",a,b);}【解析】程序中加粗部分为算法的核心,如同交换两个杯子里的饮料,必须借助第三个空杯子。
假设输入的值分别为3、7,则第一行输出为3,7;第二行输出为7,3。
其中t为中间变量,起到“空杯子”的作用。
注意:三句赋值语句赋值号左右的各量之间的关系!【应用】例2、任意读入三个整数,然后按从小到大的顺序输出。
main(){int a,b,c,t;scanf("%d%d%d",&a,&b,&c);/*以下两个if语句使得a中存放的数最小*/if(a>b){ t=a; a=b; b=t; }if(a>c){ t=a; a=c; c=t; }/*以下if语句使得b中存放的数次小*/if(b>c) { t=b; b=c; c=t; }printf("%d,%d,%d\n",a,b,c);}2.累加累加算法的要领是形如“s=s+A”的累加式,此式必须出现在循环中才能被反复执行,从而实现累加功能。
“A”通常是有规律变化的表达式,s在进入循环前必须获得合适的初值,通常为0。
例1、求1+2+3+……+100的和。
main(){int i,s;s=0; i=1;while(i<=100){s=s+i; /*累加式*/i=i+1; /*特殊的累加式*/}printf("1+2+3+...+100=%d\n",s);}【解析】程序中加粗部分为累加式的典型形式,赋值号左右都出现的变量称为累加器,其中“i = i + 1”为特殊的累加式,每次累加的值为1,这样的累加器又称为计数器。
程序代码与算例

结构有限元分析姓名:葛斌学号:10121306 班级:土建硕1005 1.主要流程图图12、变量列表及子程序说明(1)程序的主要变量和数组说明a)主要变量说明NP:结构总的结点数NE:结构总的单元数NR:结点总的约束数NNE:单元结点数NFDE:单元结点自由度数NBW:总体刚度矩阵按变带宽存储的带宽值E:弹性模量AMU:伯松比T:单元厚度b)主要数组说明COORD:结点坐标NEC:单元拓扑阵(各单元结点的总体编码)NRA:受约束结点总体编码NRP:约束的属性ALV:结点的外载和位移CS:按变带宽存储的总体刚度矩阵B:应变矩阵ES:单元刚度矩阵D:应力矩阵S:弹性矩阵DIS:单元结点位移STS:单元应力STR:单元应变ESCO: 单元刚度矩阵的子矩阵TYPEE:问题性质(平面应力、应变或轴对称)TYPEE=0 表示平面应力问题TYPEE=1 表示平面应变问题(2)各子程序功能说明GUOMIN:主程序INPUT:数据输入子程序CHECKENBW:验证变带宽子程序ADDSTF:总体刚度集成子程序SOLEQ:用高斯消元法求解位移向量子程序SOLST: 求解单元应力应变子程序OUTPUT:数据输出子程序ELESTF:求解一般三角形单元刚度子程序3、数组输入文件的格式数组输入文件格式如下:输入文件名:任意,但不超过65个字符自由格式输入第一批数据:NP,NE,NR,NBW,E,AMU,T,NNE,NFDE(输入控制参数,占1行) NP:结构总的结点数NE:结构总的单元数NR:结点总的约束数NBW:总体刚度矩阵按变带宽存储的带宽值E:弹性模量AMU:伯松比T:单元厚度第二批数据:COORD(结点坐标,占NP行)第三批数据:NEC(单元拓扑阵占NE行)第四批数据:NRA(受约束结点总体编码,占1行)第五批数据:NRP(约束属性,占1行)NRP=0~9表示Y轴受约束NRP=10~20表示X轴受约束NRP=21~表示XY轴都受约束第六批数据:ALV(结点外荷载,以次输入结点X Y方向受的结点力占1行)第七批数据:TYPEE(问题性质及单元类型信息,占1行)4、原程序附录!(1)guomin.f90主程序!**************************************************************!==============================================================! 主程序!==============================================================!************************************************************** program guomindimension coord(10,2),nec(9,3),nra(2),nrp(2),alv(20),cs(20,10)!选取不同的结构只要修改coord,nec,alv,cs数组的维数即可!用次程序分析第二个结构修改为:coord(5,2) nec(4,3) alv(10) cs(10,8) dimension b(3,6),es(6,6),d(3,3),s(3,6),dis(6),sts(3)integer typeecommon/a3/typeecommon/a1/np,ne,nr,nbw,e,amu,tcommon/a2/coord,nec,nra,nrp,alv,b,d,s,es,cs,dis,stsopen(9,file='D:\beifenchengxu\outp1.txt')!调用子程序INPUT为建立单元刚度矩阵准备原始信息call inputif(typee.eq.0)thenprint*,'该问题是平面应力问题'elseif(typee.eq.1)thenprint*,'该问题是平面应变问题'e=e/(1-amu**2)amu=amu/(1-amu)endifcall checknbw!调用子程序ADDSTF建立单元刚度矩阵和整体刚度矩阵call addstfcall soleqcall solstclose(9)stopend!(2)INPUT.F90子程序!============================================================! 数据输入!============================================================ subroutine inputdimension coord(10,2),nec(9,3),nra(2),nrp(2),alv(20),cs(20,10)!选取不同的结构只要修改coord,nec,alv,cs数组的维数即可!用次程序分析第二个结构修改为:coord(5,2) nec(4,3) alv(10) cs(10,8) dimension b(3,6),es(6,6),d(3,3),s(3,6),dis(6),sts(3)integer typeecommon/a3/typeecommon/a1/np,ne,nr,nbw,e,amu,tcommon/a2/coord,nec,nra,nrp,alv,b,d,s,es,cs,dis,stsopen(6,file='D:\beifenchengxu\inp.txt')read(6,*)np,ne,nr,nbw,e,amu,tread(6,*)((coord(i,j),j=1,2),i=1,np)read(6,*)((nec(i,j),j=1,3),i=1,ne)read(6,*)(nra(i),i=1,nr)read(6,*)(nrp(i),i=1,nr)np2=2*npread(6,*)(alv(i),i=1,np2)!判断平面问题的性质read(6,*)typeeclose(6)end!(3)checknbw.f90子程序!===========================================================! 检查变带宽值!=========================================================== subroutine checknbwdimension coord(10,2),nec(9,3),nra(2),nrp(2),alv(20),cs(20,10)!选取不同的结构只要修改coord,nec,alv,cs数组的维数即可!用次程序分析第二个结构修改为:coord(5,2) nec(4,3) alv(10) cs(10,8) dimension b(3,6),es(6,6),d(3,3),s(3,6),dis(6),sts(3)common/a1/np,ne,nr,nbw,e,amu,tcommon/a2/coord,nec,nra,nrp,alv,b,d,s,es,cs,dis,stsnnbw=0do i=1,neii=nec(i,1)jj=nec(i,2)kk=nec(i,3)ij=abs(ii-jj)jk=abs(jj-kk)ki=abs(kk-ii)enbw=max(ij,jk,ki)if(enbw.gt.nnbw)nnbw=enbwenddonnbw=2*(nnbw+1)print*,'计算出的带宽',nnbwdo while(nbw.ne.nnbw)if(nnbw.gt.nbw)thenprint*,'所选取带宽偏小'write(*,'(a)',advance='no')'请输入新的带宽:'read*,nbwelseprint*,'所选取带宽偏大'write(*,'(a)',advance='no')'请输入新的带宽:'read*,nbwendifenddoif(nnbw.eq.nbw)print*,'所选的带宽最优'end!(4)ADDSTF.f90子程序!=================================================================== ! 总纲度矩阵集成!=================================================================== subroutine addstfdimension coord(10,2),nec(9,3),nra(2),nrp(2),alv(20),cs(20,10)!选取不同的结构只要修改coord,nec,alv,cs数组的维数即可!用次程序分析第二个结构修改为:coord(5,2) nec(4,3) alv(10) cs(10,8) dimension b(3,6),es(6,6),d(3,3),s(3,6),dis(6),sts(3)common/a1/np,ne,nr,nbw,e,amu,tcommon/a2/coord,nec,nra,nrp,alv,b,d,s,es,cs,dis,stsprint*,'计算半带宽存储的总体刚度矩阵'np2=2*npdo i=1,np2do j=1,nbwcs(i,j)=0enddoenddodo n=1,necall elestf(n,1)do j=1,3do jj=1,2ir=2*(j-1)+jjir2=2*(nec(n,j)-1)+jjdo k=1,3do kk=1,2ic=2*(k-1)+kkic1=2*(nec(n,k)-1)+kkic2=ic1-ir2+1if(ic2.gt.0)thencs(ir2,ic2)=cs(ir2,ic2)+es(ir,ic)endifenddoenddoenddoenddoenddo! 边界条件的处理do n=1,nriz=nra(n)ir2=2*iz-1if(nrp(n).gt.10)thendo j=2,nbwcs(ir2,j)=0enddoif(ir2.ge.nbw)then it=nbwelseit=ir2endifif(it.ge.2)thendo j=2,itcs(ir2-j+1,j)=0enddoendifendifir2=ir2+1if(nrp(n).lt.10)thenjf=nrp(n)elsejf=nrp(n)-20endifif(jf.lt.1)thenelsedo j=2,nbwcs(ir2,j)=0enddoif(ir2.ge.nbw)thenit=nbwelseendifif(it.ge.2)thendo j=2,ir2cs(ir2-j+1,j)=0enddoendifendifenddoend!(5)SOLEQ.f90子程序!=================================================================== ! 用高斯消元法求解位移向量!=================================================================== subroutine soleq!定义数组变量和公共数据块dimension coord(10,2),nec(9,3),nra(2),nrp(2),alv(20),cs(20,10)!选取不同的结构只要修改coord,nec,alv,cs数组的维数即可!用次程序分析第二个结构修改为:coord(5,2) nec(4,3) alv(10) cs(10,8) dimension b(3,6),es(6,6),d(3,3),s(3,6),dis(6),sts(3)dimension nnp(10),u(10),v(10)common/a1/np,ne,nr,nbw,e,amu,tcommon/a2/coord,nec,nra,nrp,alv,b,d,s,es,cs,dis,sts!解数组变量方程n2=2*npm2=n2-1do k=1,m2if(n2.gt.k+nbw-1)thenim=k+nbw-1im=n2endifdo i=k+1,iml=i-k+1c=cs(k,l)/cs(k,1)l1=nbw-l+1do j=1,l1m=j+i-kcs(i,j)=cs(i,j)-c*cs(k,m)enddoalv(i)=alv(i)-c*alv(k)enddoenddoalv(n2)=alv(n2)/cs(n2,1)do i=n2-1,1,-1if(nbw.gt.n2-i+1)thenjm=n2-i+1elsejm=nbwendifdo j=2,jmih=j+i-1alv(i)=alv(i)-cs(i,j)*alv(ih)alv(i)=alv(i)/cs(i,1)enddoenddowrite(9,*)'结点水平,竖直方向的位移'write(9,'(2x,a,4x,a,12x,a)')'no','ux','uy'nnp(i)=iu(i)=alv(2*i-1)v(i)=alv(2*i)write(9,'(1x,i3,2(2x,e10.4,2x))')nnp(i),u(i),v(i)enddoend!(6)ELESTF.f90子程序!=============================================================! 求解一般问题三角形单元的单元刚度矩阵子程序!============================================================= subroutine elestf(nn,nk)dimension coord(10,2),nec(9,3),nra(2),nrp(2),alv(20),cs(20,10)!选取不同的结构只要修改coord,nec,alv,cs数组的维数即可!用次程序分析第二个结构修改为:coord(5,2) nec(4,3) alv(10) cs(10,8) dimension b(3,6),es(6,6),d(3,3),s(3,6),dis(6),sts(3)common/a1/np,ne,nr,nbw,e,amu,tcommon/a2/coord,nec,nra,nrp,alv,b,d,s,es,cs,dis,sts!计算ck,bk,cj,bj和aii=nec(nn,1)jj=nec(nn,2)kk=nec(nn,3)bi=coord(jj,2)-coord(kk,2)bj=coord(kk,2)-coord(ii,2)bk=coord(ii,2)-coord(jj,2)ci=coord(kk,1)-coord(jj,1)cj=coord(ii,1)-coord(kk,1) ck=coord(jj,1)-coord(ii,1) a=(bj*ck-bk*cj)/2.0do i=1,3do j=1,6b(i,j)=0enddoenddob(1,1)=bib(1,3)=bjb(1,5)=bkb(2,2)=cib(2,4)=cjb(2,6)=ckb(3,1)=b(2,2)b(3,2)=b(1,1)b(3,3)=b(2,4)b(3,4)=b(1,3)b(3,5)=b(2,6)b(3,6)=b(1,5)do i=1,3do j=1,6b(i,j)=b(i,j)/(2.0*a) enddoenddodo i=1,3do j=1,3d(i,j)=0enddoenddod(1,1)=1d(1,2)=amud(2,1)=d(1,2)d(2,2)=d(1,1)d(3,3)=(1-amu)/2dd=e/(1-amu**2)do i=1,3do j=1,3d(i,j)=d(i,j)*ddenddoenddos=matmul(d,b)if(nk.lt.1.0)thens=matmul(d,b)elsedo i=1,6do j=1,6es(i,j)=0do k=1,3es(i,j)=es(i,j)+s(k,i)*b(k,j)*a*tenddoenddoenddoendifend!(7)SOLST.f90子程序!===================================================================! 求解单元应力,应变!=================================================================== subroutine solstdimension coord(10,2),nec(9,3),nra(2),nrp(2),alv(20),cs(20,10)!选取不同的结构只要修改coord,nec,alv,cs数组的维数即可!用次程序分析第二个结构修改为:coord(5,2) nec(4,3) alv(10) cs(10,8) dimension b(3,6),es(6,6),d(3,3),s(3,6),dis(6),sts(3)dimension str(3)common/a1/np,ne,nr,nbw,e,amu,tcommon/a2/coord,nec,nra,nrp,alv,b,d,s,es,cs,dis,stswrite(9,*)'单元的主应力及其与X轴夹角及单元应变值'write(9,'(2x,a,4x,a,6x,a,5x,a,4x,3(a,6x))')'No','stsmax','stsmin','an gle','stn_x','stn_y','stn_xy'do n=1,necall elestf(n,0)do i=1,3do j=1,2ij=2*(i-1)+jmij=2*(nec(n,i)-1)+jdis(ij)=alv(mij)enddoenddodo i=1,3sts(i)=0str(i)=0do j=1,6sts(i)=sts(i)+s(i,j)*dis(j)str(i)=str(i)+b(i,j)*dis(j)enddoenddoavests=(sts(1)+sts(2))/2.0stsr=sqrt(((sts(1)-sts(2))/2.0)**2+sts(3)**2)stsmax=avests+stsrstsmin=avests-stsrif(sts(2).ne.stsmin)thenang=28.6624*atan(2.*sts(3)/(sts(2)-sts(1)))elseang=0endifwrite(9,'(1x,i3,2x,2(e10.4,2x),f6.2,2x,3(e10.4,2x))')n,stsmax,stsmin, ang,str(1),str(2),str(3)enddoend6、应用实例一结构及其受力图示如下:图1输入文件:5,4,2,5,1.0,0.25,10,02,01,10,22,21,2,32,5,31,3,43,5,41,212,20,0,0,0,0,0,0,0,0,10输出文件:结点水平、竖直方向的位移值no ux uy1 0.0000E+00 0.1167E+022 0.3501E+01 0.0000E+003 0.2614E+01 0.7398E+014 -.4469E+02 -.2063E+025 -.7487E+01 0.2719E+02单元的主应力及其与X轴夹角及单元应变值No stsmax stsmin angle stn_x stn_y stn_xy 1 0.4199E+01 0.2175E+00 43.94 0.1750E+01 0.1562E+01 -.4973E+012 0.1328E+02 -.1295E+01 1.10 -.4607E+01 0.1359E+02 0.7018E+003 0.2284E+02 -.1110E+02 7.15 0.2496E+02 -.1615E+02 -.1047E+024 0.1894E+02 0.3655E+00 5.96 0.1860E+02 -.4120E+01 -.4793E+018、应用实例二结构及其受力图示如下:图2输入文件:10,9,2,8,1.0,0.25,10,02,04,06,01,23,25,22,44,43,61,2,52,3,63,4,73,7,62,6,55,6,86,7,96,9,88,9,101,422,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10 0输出文件:结点水平、竖直方向的位移值no ux uy1 0.0000E+00 0.0000E+002 0.1508E+02 0.3930E+003 0.2923E+03 0.4488E+024 0.2165E+04 0.0000E+005 0.5338E+01 -.5183E+016 0.3917E+01 0.7772E+017 0.2048E+03 0.4218E+028 0.1567E+01 0.4323E+029 0.4287E+00 0.3162E+0210 -.8820E+01 0.4985E+02单元的主应力及其与X轴夹角及单元应变值No stsmax stsmin angle stn_x stn_y stn_xy 1 0.7339E+01 -.8750E+00 2.53 0.7538E+01 -.2690E+01 -.9036E+002 0.1496E+03 0.2536E+02 9.92 0.1386E+03 -.7431E+01 -.5266E+023 0.1058E+04 0.2030E+03 15.00 0.9361E+03 0.9872E+01 -.5343E+034 0.1141E+03 0.6541E+01 17.42 0.1004E+03 -.9950E+01 -.7679E+025 0.5101E+00 -.8565E+00 23.60 -.7104E+00 0.4506E+00 0.1253E+016 0.2240E+02 0.4611E+01 6.43 -.7104E+00 0.2097E+02 0.4947E+017 0.1104E+03 0.2791E+02 9.85 0.1004E+03 0.3321E+01 -.3476E+028 0.1631E+02 0.2695E+01 -12.64 -.5693E+00 0.1483E+02 -.7266E+019 0.8834E+01 -.1311E+01 -28.85 -.5693E+00 0.6212E+01 -.1071E+02。
C++计算数学计算式(内附完整源码及附件)

温馨提示程序语言:C、C++、C#、Python(红色字体表示本课设使用的程序设计语言)图形功能选项:Win32控制台程序(黑框、文本界面)、Win32程序、MFC、WinForm、DirectX10(黑体标明表示本课设的程序图形类别,默认为非图形界面Win32控制台程序)数据结构:基础类型、数组、链表、双向链表、搜索树(非平衡二叉树)、平衡二叉树、链表与平衡二叉树相结合、堆栈、队列、串、图(黑体标明表示本课设使用的数据结构)C++语言项:STL库(黑体标明表示使用C++的STL库)编译环境:Windows 7 64位旗舰版(Linux及其他环境请谨慎下载)集成开发环境:Visual C++ 6.0、DEVC++、CodeBlocks、Visual Studio 2015均可通过编译。
(浅蓝色字体表示无法通过编译)分多头文件编译:否(所有代码基本都包含在一个文件内,如需试验头文件功能,请自行参考相关文献)内容说明:1、课设题目及预览内容将在第二页开始展示。
2、代码行数:175行3、目录所示内容,本文基本涵盖,如无内容,会在本页进行说明。
4、附录绝对包含用户使用手册及程序完整源代码和详细注释。
5、如需下载其他头文件(例如DirectX需另行配置),本文会在此进行说明。
6、本文撰写内容仅供学习参考,另外,由于本人水平有限,编写之处难免存在错误和纰漏,恳请各位老师或同学批评指正。
题目:输入一个算式,并计算结果运行结果如下图所示:附录用户使用手册1、根据提示,输入一条计算式即可。
2、开头无法输入负数,否则程序会崩溃。
3、输入的计算式需正确,否则会崩溃程序源代码#include<iostream>#include<stack>#include<queue>#include<string>#include<cctype>#include<stdio.h>#include<stdlib.h>#pragma warning(disable:4996)using namespace std;class Expression{public:void setExpression(); //从屏幕获取一行计算式子void calculationResult(); //计算出结果,并输出private:void transformation(); //将中缀表达式转换成后缀表达式stack<string> stringStack; //栈queue<string> stringQueueMiddle; //存储中缀表达式的队列queue<string> stringQueueBack; //存储后缀表达式的队列};void Expression::setExpression(){char ch[200];string str; //获取屏幕的表达式string strNumber; //暂时存储数字string strSymbol; //暂时存储运算符int i = 0;cout <<"请输入一个表达式(不需要输入=,请不要输入无谓的字符隔开,比如空格):"<< endl;cout <<"\t";cin.getline(ch, 200);str = ch;for (i = 0; i < str.size(); i++) {if (str[i] >= '0'&&str[i] <= '9'||'.'==str[i]) {strNumber += str[i];}else {stringQueueMiddle.push(strNumber); //将数字添加到队列strNumber.clear(); //清空字符串strSymbol += str[i];stringQueueMiddle.push(strSymbol); //将符号添加到队列strSymbol.clear(); //清空字符串}}//将最后一个数字添加到队列stringQueueMiddle.push(strNumber); //将数字添加到队列strNumber.clear(); //清空字符串transformation();}void Expression::transformation(){int i = 0;for (; !stringQueueMiddle.empty(); stringQueueMiddle.pop()) {if (isdigit(stringQueueMiddle.front()[0])) //判断该字符串的第一个字符是否为数字stringQueueBack.push(stringQueueMiddle.front()); //纯数字则将该字符串添加到后缀表达式队列else if (stringStack.empty() || '(' == stringQueueMiddle.front()[0])stringStack.push(stringQueueMiddle.front()); //如果栈空或者遇到 (,则直接进栈else if ('+' == stringQueueMiddle.front()[0] || '-' == stringQueueMiddle.front()[0]) {if (!stringStack.empty()&&'*'==stringStack.top()[0]||'/' ==stringStack.top()[0]) { //栈不空,则栈中有 */ 则出栈//栈中只要有连续的 +-*/就出栈,且栈不能为空,遇到(也不出栈for(; !stringStack.empty()&& '('!= stringStack.top()[0]; stringStack.pop()) stringQueueBack.push(stringStack.top()); // */ 进入后缀表达式队列}else if (!stringStack.empty() && '+' == stringStack.top()[0] || '-' == stringStack.top()[0]) { //如果遇到同等级的运算符,则先出栈再进栈stringQueueBack.push(stringStack.top());stringStack.pop(); //栈顶出栈stringStack.push(stringQueueMiddle.front()); //+-优先级低,直接进栈}else if ('*' == stringQueueMiddle.front()[0] || '/' == stringQueueMiddle.front()[0]) {if (!stringStack.empty() && '*' == stringStack.top()[0] || '/' ==stringStack.top()[0]) { //栈不空,则栈中有 */ 则出栈stringQueueBack.push(stringStack.top()); //进后缀表达式的队stringStack.pop();}stringStack.push(stringQueueMiddle.front()); //进栈}else if (')' == stringQueueMiddle.front()[0]) { //遇到右括号,则左括号之前的运算符都弹出for (; '(' != stringStack.top()[0]; stringStack.pop())stringQueueBack.push(stringStack.top()); //运算符依次进入后缀表达式队列stringStack.pop(); //弹出 (}}for (; !stringStack.empty();stringStack.pop()){ // 中缀表达式扫描完毕,则栈中的所有运算符弹出if('('!=stringStack.top()[0])stringQueueBack.push(stringStack.top()); //将栈中的运算符添加到后缀表达式队列}}void Expression::calculationResult(){double back=0.0; //记录第一个从栈顶弹出来的元素double front=0.0; //记录第二个从栈顶弹出来的元素double result=0.0; //记录运算结果char ch[100];string str;for (; !stringQueueBack.empty(); stringQueueBack.pop()) {if (isdigit(stringQueueBack.front()[0])) //判断该字符串的第一个字符是否为数字stringStack.push(stringQueueBack.front()); //纯数字则将该字符串进栈else { //遇到运算符switch (stringQueueBack.front()[0])case'+':back = atof(stringStack.top().c_str()); //弹出第一个栈顶元素stringStack.pop();front = atof(stringStack.top().c_str()); //弹出第二个栈顶元素stringStack.pop();result = front + back;sprintf(ch, "%lf", result); //将浮点数转换成字符串str = ch;stringStack.push(str);break;case'-':back = atof(stringStack.top().c_str()); //弹出第一个栈顶元素stringStack.pop();front = atof(stringStack.top().c_str()); //弹出第二个栈顶元素stringStack.pop();result = front - back;sprintf(ch, "%lf", result); //将浮点数转换成字符串str = ch;stringStack.push(str);break;case'*':back = atof(stringStack.top().c_str()); //弹出第一个栈顶元素stringStack.pop();front = atof(stringStack.top().c_str()); //弹出第二个栈顶元素stringStack.pop();result = front * back;sprintf(ch, "%lf", result); //将浮点数转换成字符串str = ch;stringStack.push(str);break;case'/':back = atof(stringStack.top().c_str()); //弹出第一个栈顶元素stringStack.pop();front = atof(stringStack.top().c_str()); //弹出第二个栈顶元素stringStack.pop();result = front / back;sprintf(ch, "%lf", result); //将浮点数转换成字符串str = ch;stringStack.push(str);break;default:break;}}}实用文档文案大全main.cppcout <<"\t="<< stringStack.top()<<endl; //栈只剩下一个结果,直接输出即可}int main(void){Expression e;e.setExpression();e.calculationResult();return 0;}附件。
计算方法及程序实现

一、对分法1、#include"math.h" main(){float a[3]={-3.0,1.0,0.0},b[3]={-2,0,1},c[3];float f(float x);int i; for(i=0;i<3;i++) {do{ c[i]=(a[i]+b[i])/2.0; if(f(c[i])==0) exit(0); else if(f(c[i])*f(a [i])<0) b[i]=c[i]; else a[i]=c[i]; }while((b[i]-a[i])>1e-5); }c[i]=a[i]; printf("the roots are:");for(i=0;i<3;i++) printf("%f",c[i]);printf("2.000000"); } float f(float x){ float y; y=x*x*x-2*x*x-4*x-7; return(y); } 3、对分部分函数调用(题目要求如2)#include "math.h" float f(float x) { float y; y=x*x*x-2*x*x-4*x-7; return(y);} float f1(float a ,float b) { float c; do{ c=(a+b)/2;if(f(c)==0) exit(0);else if(f(a)*f(c)<0) b=c; else a=c;} while((b-a)>1e-5);return(a);} main(){ float a=3.0,b=4.0,s; s=f1(a,b);printf("the root is %f",s);}2、用对分法求出方程x3-2x2-4x-7=0 在区间【3,4】内的根,精度要求为105 。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《计算方法》程序集及例程(C语言部分)研究生《计算方法》课程学习辅助教材江西理工大学理学院实验一:拉格朗日插值多项式命名(源程序.cpp及工作区.dsw):lagrange问题:的函数近似值用四次拉格朗日多项式求4//Lagrange.cpp#include <stdio.h>#include <conio.h>#define N 4int checkvalid(double x[], int n);void printLag (double x[], double y[], double varx, int n);double Lagrange(double x[], double y[], double varx, int n);void main (){double x[N+1] = {0.4, 0.55, 0.8, 0.9, 1};double y[N+1] = {0.41075, 0.57815, 0.88811, 1.02652, 1.17520};double varx = 0.5;if (checkvalid(x, N) == 1){printf("\n\n插值结果: P(%f)=%f\n", varx, Lagrange(x, y, varx, N));} else{printf("结点必须互异");}getch();}int checkvalid (double x[], int n){int i,j;for (i = 0; i < n; i++){for (j = i + 1; j < n+1; j++){if (x[i] == x[j])//若出现两个相同的结点,返回-1{return -1;}}}return 1;}double Lagrange (double x[], double y[], double varx, int n){double fenmu;double fenzi;double result = 0;int i,j;printf("Ln(x) =\n");for (i = 0; i < n+1; i++){fenmu = 1;for (j = 0; j < n+1; j++){if (i != j){fenmu = fenmu * (x[i] - x[j]);}}printf("\t%f", y[i] / fenmu);fenzi = 1;for (j = 0; j < n+1; j++){if (i != j){printf("*(x-%f)", x[j]);fenzi = fenzi * (varx - x[j]);}}if (i != n){printf("+\n");}result += y[i] / fenmu * fenzi;}return result;}运行及结果显示:实验二:牛顿插值多项式命名(源程序.cpp及工作区.dsw):newton_cz问题:4//newton_cz.cpp#include<stdio.h>#include<iostream.h>#include<conio.h>#define N 4int checkvaild(double x[],int n){int i,j;for(i=0;i<n+1;i++){for(j=i+1;j<n+1;j++)if(x[i]==x[j])return -1;}return 1;}void chashang(double x[],double y[],double f[][N+1]){int i,j,t=0;for(i=0;i<N+1;i++){f[i][0]=y[i];//f[0][0]=y[0],f[1][0]=y[1];f[2][0]=y[2];f[3][0]=y[3];f[4][0]=y[4]}for(j=1;j<N+1;j++)// 阶数j{for(i=0;i<N-j+1;i++) //差商个数if[i][j]=(f[i+1][j-1]-f[i][j-1])/(x[t+i+1]-x[i]);//一阶为f[0][1]~f[3][1];二阶为f[0][2]~f[2][2]//三阶为f[0][3]~f[1][3];四阶为f[0][4] t++;}}double compvalue(double t[][N+1],double x[],double varx){int i,j,r=0;double sum=t[0][0],m[N+1]={sum,1,1,1,1};printf("i\tXi\t F(Xi)\t 1阶\t 2阶\t\t3阶\t 4阶\n");printf("--------------------------------------------------------------------------------");for(i=0;i<N+1;i++){r=i;printf("x%d\t%f ",i,x[i]);for(j=0;j<=i;j++){printf("%f ",t[r][j]);r--;}printf("\n");}printf("--------------------------------------------------------------------------------");/**/ printf("N(x) =\n");printf(" %f\n",t[0][0]);for(i=1;i<N+1;i++){for(j=0;j<i;j++)m[i]=m[i]*(varx-x[j]);m[i]=t[0][i]*m[i];sum=sum+m[i];}for(i=1;i<N+1;i++){ printf(" +%f*",t[0][i]);for(j=0;j<i;j++)printf("(x-%f)",x[j]);printf("\n");}return sum;}void main(){double varx,f[N+1][N+1];double x[N+1]={0.4,0.55,0.8,0.9,1};double y[N+1]={0.41075,0.57815,0.88811,1.02652,1.17520};checkvaild(x,N);chashang(x,y,f);varx=0.5;if(checkvaild(x,N)==1){chashang(x,y,f);printf("\n\n牛顿插值结果: P(%f)=%f\n",varx,compvalue(f,x,varx));}elseprintf("输入的插值节点的x值必须互异!");getch();}运行及结果显示:实验三:自适应梯形公式命名(源程序.cpp 及工作区.dsw ):autotrap ][n T问题:计算⎰+=10214dx xπ的近似值,使得误差(EPS )不超过610- //autotrap.cpp#include<stdio.h> #include<conio.h> #include<math.h> #define EPS 1e-6 double f(double x) { return 4/(1+x*x); }double AutoTrap(double(*f)(double),double a,double b,double eps) { double t2,t1,sum=0.0; int i,k; t1=(b-a)*(f(a)+f(b))/2; printf("T(%4d)=%f\n",1,t1); for(k=1;k<11;k++) { for(i=1;i<=pow(2,k-1);i++) sum+=f(a+(2*i-1)*(b-a)/pow(2,k)); t2=t1/2+(b-a)*sum/pow(2,k); printf("T(%4d)=%f\n",(int)pow(2,k),t2); if(fabs(t2-t1)<EPS) break; else t1=t2; sum=0.0; } return sum; }void main() {s=AutoTrap(f,0.0,1.0,EPS); getch(); }运行及结果显示:实验四:龙贝格算法命名(源程序.cpp 及工作区.dsw ):romberg 问题:求⎰+=10214dx xπ的近似值,要求误差不超过610- //romberg.cpp#include <stdio.h> #include <conio.h> #include <math.h> #define N 20 #define EPS 1e-6double f(double x){return 4/(1+x*x);}double Romberg(double a,double b,double (*f)(double),double eps) { double T[N][N],p,h; int k=1,i,j,m=0; T[0][0]=(b-a)/2*(f(a)+f(b)); do{ p=0; h=(b-a)/pow(2,k-1); for(i=1;i<=pow(2,k-1);i++) p=p+f(a+(2*i-1)*h/2); T[0][k]=T[0][k-1]/2+p*h/2; for(i=1;i<=k;i++) {j=k-i; T[i][j]=(pow(4,i)*T[i-1][j+1]-T[i-1][j])/(pow(4,i)-1); } k++; p=fabs(T[k-1][0]-T[k-2][0]); }while(p>=EPS); k--;while(m<=k){for(i=0;i<=m;i++)printf("T(%d,%d)=%f ",i,m-i,T[i][m-i]); m++;printf("\n"); }return T[k][0]; }void main() { printf("\n\n 积分结果 = %f",Romberg(0,1,f,EPS));}运行及结果显示:实验五:牛顿切线法问题:求方程01)(3=--=x x x f 在5.1=x ,6.0=x 附近的根(精度31021-⨯=) //newton_qxf.cpp #include <math.h> #include<conio.h> #include <stdio.h> #define MaxK 1000 #define EPS 0.5e-3double f(double x) { return x*x*x-x-1;}double f1(double x) { return 3*x*x-1; }int newton(double (*f)(double), double (*f1)(double), double &x0, double eps) { double xk, xk1; int count = 0;printf("k\txk\n");printf("-----------------------\n"); xk = x0;printf("%d\t%f\n", count, xk);do {if((*f1)(xk)==0)return 2;xk1 = xk - (*f)(xk) / (*f1)(xk);if (fabs(xk - xk1) < eps){count++;xk = xk1;printf("%d\t%f\n", count, xk);x0 = xk1;return 1;}count++;xk = xk1;printf("%d\t%f\n", count, xk);}while(count < MaxK);return 0;}void main(){for(int i=0;i<2;i++){double x=0.6;if(i==1)x=1.5;printf("x0初值为%f:\n",x);if (newton(f, f1, x, EPS) == 1){printf("-----------------------\n");printf("the root is x=%f\n\n\n", x);}else{printf("the method is fail!");}}getch();}实验六:牛顿下山法命名(源程序.cpp 及工作区.dsw ):newton_downhill 问题:求方程01)(3=--=x x x f 在5.1=x ,6.0=x 附近的根(精度31021-⨯=) //newton_downhill.cpp #include <stdio.h> #include <conio.h> #include <math.h> #include <stdlib.h>#define Et 1e-3//下山因子下界 #define E1 1e-3//根的误差限 #define E2 1e-3//残量精度double f(double x) { return x * x * x - x - 1; }double f1(double x) { return 3 * x * x - 1; }void errormess(int b){char *mess;switch(b){case -1:mess = "f(x)的导数为0!";break;case -2:mess = "下山因子已越界,下山处理失败";break;default:mess = "其他类型错误!";}printf("the method has faild! because %s", mess);}int Newton(double (*f)(double), double (*f1)(double), double &x0) {int k = 0;double t;double xk, xk1;double fxk, fxk_temp;printf("k t xk f(xk)\n");printf("----------------------------------------------------------\n");printf("%-20d", k);xk = x0;printf("%-15f", x0);fxk = (*f)(xk);printf("%-20f", fxk);printf("\n");for (k = 1; ; k++){t = 1;while(1){printf("%-10d", k);printf("%-10f", t);if((*f1)(xk) != 0){xk1 = xk - t * (*f)(xk) / (*f1)(xk);}else{return -1;}printf("%-15f", xk1);fxk_temp = (*f)(xk1);printf("%-20f", fxk_temp);if(fabs(fxk_temp) >fabs(fxk)){t = t / 2;printf("\n");if (t < Et){return -2;}}else{printf("下山成功\n");break;}}if (fabs(xk-xk1)<E1){x0 = xk1;return 1;}xk = xk1;}}void main(){int b;double x0;x0 = 0.6;b = Newton(f, f1, x0);if (b == 1)printf("\nthe root x=%f\n", x0);elseerrormess(b);getch();}运行及结果显示:实验七:埃特金加速算法命名(源程序.cpp 及工作区.dsw ):aitken问题:求方程01)(3=--=x x x f 在5.1=x ,6.0=x 附近的根(精度31021-⨯=)//aitken.cpp#include <math.h>#include <stdio.h>#include <conio.h>#define MaxK 100#define EPS 0.5e-3double g(double x){return x * x * x - 1;}int aitken (double (*g)(double), double &x, double eps){int k;double xk = x, yk, zk, xk1;printf("k xk yk zk xk+1\n");printf("-------------------------------------------------------------------\n");for (k = 0;k<MaxK; k++){yk = (*g)(xk);zk = (*g)(yk);xk1 = xk - (yk - xk) * (yk - xk) / (zk - 2 * yk + xk);printf("%-10d%-15f%-15f%-15f%-15f\n", k, xk, yk, zk, xk1);if (fabs(yk-xk)<=eps){x = xk1;return k + 1;}xk = xk1;}return -1;}void main (){double x = 1.5;int k;k = aitken(g, x, EPS);if (k == -1)printf("迭代次数越界!\n");elseprintf("\n 经k=%d 次迭代,所得方程根为:x=%f\n", k, x);getch();}运行及结果显示:实验八:正割法问题:求方程01)(3=--=x x x f 在5.1=x 附近的根(精度0.5e-8)//ZhengGe.cpp#include <math.h>#include <stdio.h>#include <conio.h>#define MaxK 1000#define EPS 0.5e-8double f(double x){return x*x*x-x-1;}int ZhengGe(double (*f)(double), double x0, double &x1, double eps) {printf("k xk f(xk)\n");printf("---------------------------------------------\n");int k;double xk0, xk, xk1;xk0 = x0;printf("%-10d%-15f%-15f\n", 0, x0, (*f)(x0));xk = x1;for (k=1;k<MaxK;k++){if((*f)(xk)-(*f)(xk0)==0)return -1;xk1 = xk - (*f)(xk) / ( (*f)(xk) - (*f)(xk0) ) * (xk - xk0);printf("%-10d%-15f%-15f\n", k, xk, (*f)(xk));if (fabs(xk1 - xk)<=eps){printf("%-10d%-15f%-15f\n\n", k + 1, xk1, (*f)(xk1));printf("---------------------------------------------\n\n");x1 = xk1;return 1;}xk0 = xk;xk = xk1;}return -2;}void main (){double x0 = 1, x1 = 2;if (ZhengGe(f, x0, x1, EPS) == 1){printf("the root is x = %f\n", x1);}else{printf("the method is fail!");}getch();}实验九:高斯列选主元算法命名(源程序.cpp 及工作区.dsw ):colpivot问题:求解方程组并计算系数矩阵行列式值 ⎪⎩⎪⎨⎧=-+=+-=-+2240532321321321x x x x x x x x x//colpivot.cpp#include <math.h>#include <stdio.h>#include <conio.h>#define N 3static double aa[N][N]={{1,2,-1},{1,-1,5},{4,1,-2}};static double bb[N+1]={3,0,2};void main(){int i,j;double a[N+1][N+1],b[N+1],x[N+1],det;double gaussl(double a[][N+1],double b[],double x[]);for(i=1;i<=N;i++){for(j=1;j<=N;j++) a[i][j]=aa[i-1][j-1];b[i]=bb[i-1];}det=gaussl(a,b,x);if(det!=0){printf("\n 方程组的解为:");for(i=1;i<=N;i++)printf(" x[%d]=%f",i,x[i]);printf("\n\n 系数矩阵的行列式值=%f",det);}else printf("\n\n 系数矩阵奇异阵,高斯方法失败 !:");getch();}double gaussl(double a[][N+1],double b[],double x[])//a传入增广矩阵(有效元素为a[1,1]...a[n,n+1]),x负责传入迭代初值并返回解向量//(有效值为x[1]...x[n]);返回值:系数矩阵行列式值detA{double det=1.0,F,m,temp;int i,j,k,r;void disp(double a[][N+1],double b[]);printf("消元前增广矩阵:\n");disp(a,b);for(k=1;k<N;k++){temp=a[k][k];r=k;for(i=k+1;i<=N;i++){if(fabs(temp)<fabs(a[i][k])){temp=a[i][k];r=i;}//按列选主元,即确定ik}if(a[r][k]==0)return 0;//如果aik,k=0,则A为奇异矩阵,停止计算if(r!=k){for(j=k;j<=N;j++){a[k][j]+=a[r][j];a[r][j]=a[k][j]-a[r][j];a[k][j]-=a[r][j];}b[k]+=b[r];b[r]=b[k]-b[r];b[k]-=b[r];det=-det;//如果ik!=k,则交换[A,b]第ik行与第k行元素printf("交换第%d, %d行:\n",k,r);disp(a,b);}for(i=k+1;i<=N;i++){m=a[i][k]/a[k][k];for(j=1;j<=k;j++)a[i][j]=0.0;for(j=k+1;j<=N;j++)a[i][j]-=m*a[k][j];b[i]-=m*b[k];}printf("第%d次消元:\n",k);disp(a,b);det*=a[k][k];} //大FOR循环结束x[N]=b[N]/a[N][N];for(i=N-1;i>0;i--){F=0.0;for(j=i+1;j<=N;j++)F+=a[i][j]*x[j];x[i]=(b[i]-F)/a[i][i];}det*=a[N][N];return det;}void disp(double a[][N+1],double b[])//显示选主元及消元运算中间增广矩阵结果{int i,j;for(i=1;i<=N;i++){for(j=1;j<=N;j++)printf("%10f\t",a[i][j]);printf("%10f\n",b[i]);}}运行及结果显示:实验十:高斯全主元消去算法命名(源程序.cpp 及工作区.dsw ):fullpivot问题:利用全主元消去法求解方程组⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡----9555.04525.015.0201.0321x x x//fullpivot.cpp#include <math.h>#include <stdio.h>#include <conio.h>#define N 3static double aa[N][N]={{0.01,2,-0.5},{-1,-0.5,2},{5,-4,0.5}};static double bb[N]={-5,5,9};void main(){int i,j;double a[N+1][N+1],b[N+1],x[N+1],det;int t[N+1];//引入列交换保存x向量的各分量的位置顺序double gaussl(double a[][N+1],double b[],double x[],int t[]);for(i=1;i<=N;i++){for(j=1;j<=N;j++) a[i][j]=aa[i-1][j-1];b[i]=bb[i-1];}for(i=1;i<=N;i++)t[i]=i;det=gaussl(a,b,x,t);if(det!=0){ printf("\n方程组的解为:");for(i=N;i>=1;i--){printf(" x[%d]=%f",t[i],x[i]);if(i>1)printf(" -->");}printf("\n\n系数矩阵的行列式值=%f",det);}else printf("\n\n系数矩阵奇异阵,高斯方法失败!:");getch();}double gaussl(double a[][N+1],double b[],double x[],int t[])//a传入增广矩阵(有效元素为a[1,1]...a[n,n+1]),x负责传入迭代初值并返回解向量//(有效值为x[1]...x[n]);返回值:系数矩阵行列式值detA{double det=1.0,F,m,temp;int i,j,k,r,s;void disp(double a[][N+1],double b[],int x[]);// printf("消元前增广矩阵:\n");//disp(a,b,t);for(k=1;k<N;k++){temp=a[k][k];s=k;for(i=k;i<=N;i++)for(j=k;j<=N;j++)if(fabs(temp)<fabs(a[i][j])){temp=a[i][j];r=i;s=j;}//选主元,选取ik,jkif(a[r][s]==0)return 0;if(r!=k){for(j=k;j<=N;j++){a[k][j]+=a[r][j];a[r][j]=a[k][j]-a[r][j];a[k][j]-=a[r][j];}b[k]+=b[r];b[r]=b[k]-b[r];b[k]-=b[r];det=-det;printf("交换第%d, %d行:\n",k,r);disp(a,b,t);}if(s!=k){for(i=0;i<=N;i++){a[i][k]+=a[i][s];a[i][s]=a[i][k]-a[i][s];a[i][k]-=a[i][s];}t[k]+=t[s];t[s]=t[k]=t[s];t[k]-=t[s];det=-det;printf("交换第%d, %d列:\n",k,s);disp(a,b,t);}for(i=k+1;i<=N;i++){m=a[i][k]/a[k][k];for(j=1;j<=k;j++)a[i][j]=0.0;for(j=k+1;j<=N;j++)a[i][j]-=m*a[k][j];b[i]-=m*b[k];} //消元计算printf("第%d次消元:\n",k);disp(a,b,t);det*=a[k][k];} //大FOR循环结束x[N]=b[N]/a[N][N];for(i=N-1;i>0;i--){F=0.0;for(j=i+1;j<=N;j++)F+=a[i][j]*x[j];x[i]=(b[i]-F)/a[i][i];}//回代计算det*=a[N][N];return det;}void disp(double a[][N+1],double b[],int x[])//显示选主元及消元运算中间增广矩阵结果{int i,j;for(i=1;i<=N;i++){for(j=1;j<=N;j++)printf("%f\t",a[i][j]);printf("| x%d = %f\n",x[i],b[i]);}}运行及结果显示:实验十一:LU 分解算法命名(源程序.cpp 及工作区.dsw ):LU问题:利用LU 法求解方程组 ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡472111312613321x x x//LU.cpp#include<math.h>#include<stdio.h>#include<conio.h>#define N 3static aa[N][N]={{3,1,6},{2,1,3},{1,1,1}};static bb[N]={2,7,4};void main(){int i,j;double a[N+1][N+1],b[N+1];void solve(double a[][N+1],double b[N+1]);int LU(double a[][N+1]);for(i=1;i<=N;i++){for(j=1;j<=N;j++)a[i][j]=aa[i-1][j-1];b[i]=bb[i-1];}if(LU(a)==1){printf("矩阵L如下\n");for(i=1;i<=N;i++){for(j=1;j<=i;j++)if(i==j)printf("%12d ",1);else printf("%12f",a[i][j]);printf("\n");}printf("\n矩阵U如下\n");for(i=1;i<=N;i++){for(j=1;j<=N;j++)if(i<=j)printf("%12f",a[i][j]);else printf("%12s","");printf("\n");}solve(a,b);for(i=1;i<=N;i++)printf("x[%d]=%f ",i,b[i]);printf("\n");}else printf("\nthe LU method failed!\n");getch();}int LU(double a[][N+1])//对N阶矩A阵进行LU分解,结果L、U存放在A的相应位置{int i,j,k,s;double m,n;for(i=2;i<=N;i++)a[i][1]/=a[1][1];for(k=2;k<=N;k++){for(j=k;j<=N;j++){m=0;for(s=1;s<k;s++)m+=a[k][s]*a[s][j];a[k][j]-=m;}if(a[k][k]==0){printf("a[%d][%d]=%d ",k,k,0);return -1;//存在元素akk为0}for(i=k+1;i<=N;i++){n=0;for(s=1;s<k;s++)n+=a[i][s]*a[s][k];a[i][k]=(a[i][k]-n)/a[k][k];}}return 1;//正常结束}void solve(double a[][N+1],double b[N+1])//利用分解的LU求x//回代求解,L和U元素均在A矩阵相应位置;b存放常数列,返回时存放方程组的解{double y[N+1],F;int i,j;y[1]=b[1];for(i=2;i<=N;i++){F=0.0;for(j=1;j<i;j++)F+=a[i][j]*y[j];y[i]=b[i]-F;}b[N]=y[N]/a[N][N];for(i=N-1;i>0;i--){F=0.0;for(j=N;j>i;j--)F+=a[i][j]*b[j];b[i]=(y[i]-F)/a[i][i];}}运行及结果显示:实验十二:Guass-Sediel 算法命名(源程序.cpp 及工作区.dsw ):GS问题:利用G -S 法求解方程组 ⎪⎩⎪⎨⎧=+--=-+-=--2.453.82102.7210321321321x x x x x x x x x (精度为41021-⨯)//Guass_sediel.cpp#include "iostream.h"#include "math.h"#include "stdio.h"#include<conio.h>#define N 3 //方程的阶数#define MaxK 100 //最大迭代次数#define EPS 0.5e-4 //精度控制static double aa[N][N]={{10,-1,-2},{-1,10,-2},{-1,-1,5}};static double bb[N]={7.2,8.3,4.2};void main(){int i,j;double x[N+1];double a[N+1][N+1],b[N+1];int GaussSeidel(double a[][N+1],double b[],double x[]);for(i=1;i<=N;i++){for(j=1;j<=N;j++)a[i][j]=aa[i-1][j-1];b[i]=bb[i-1];x[i]=0;}if(GaussSeidel(a,b,x)==1){printf("the roots is:");for(i=1;i<=N;i++)printf(" x[%d]=%f ",i,x[i]);printf("\n");}else printf("\nthe G-S method failed!\n");getch();}int GaussSeidel(double a[][N+1],double b[],double x[])//a传入系数矩阵(有效元素为a[1,1]...a[n,n]),b为方程组右边常数列,x传入迭代初值并返回解向量//x**(k+#x)=Gx**(k)+f{int k=1,i,j;double m,max,t[N+1];while(true){printf("k=%d:",k);max=0.0;for(i=1;i<=N;i++){if(a[i][i]==0)return -1;//存在元素akk为0m=0.0;t[i]=x[i];for(j=1;j<=N;j++)if(j!=i)m+=a[i][j]*x[j];x[i]=(b[i]-m)/a[i][i];if(max<fabs(x[i]-t[i]))max=fabs(x[i]-t[i]);printf(" x[%d]=%f ",i,x[i]);}printf("\n");if(max<EPS)return 1;//正常结束elsek++;if(k>MaxK)return -2;//迭代次数越界}}运行及结果显示:实验十三:SOR 算法命名(源程序.cpp 及工作区.dsw ):sor问题:利用SOR 法求解方程组⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡----111141111411114111144321x x x x (精度为51021-⨯)//SOR.cpp#include "math.h"#include "stdio.h"#include "conio.h"#define N 4#define MaxK 1000#define EPS 0.5e-5static double aa[N][N]={{-4,1,1,1},{1,-4,1,1},{1,1,-4,1},{1,1,1,-4}};static double bb[N]={1,1,1,1};void main(){int i,j;double x[N+1];double a[N+1][N+1],b[N+1];int Sor(double a[][N+1],double b[],double w,double x[]);for(i=1;i<=N;i++){for(j=1;j<=N;j++)a[i][j]=aa[i-1][j-1];b[i]=bb[i-1];x[i]=0;}if(Sor(a,b,1.3,x)==1){printf("the roots is:");for(i=1;i<=N;i++)printf(" x[%d]=%f ",i,x[i]);printf("\n");}else printf("\nthe G-S method failed!\n");getch();}int Sor(double a[][N+1],double b[],double w,double x[]){int i,j,k;double loft,comb;for(k=0;k<=N;k++)x[k]=0;for(i=1;i<=MaxK && fabs(comb)>EPS;i++){printf("k=%d:\t",i);comb=0;for(k=1;k<=N;k++){loft=b[k];for(j=1;j<N+1;j++)loft-=a[k][j]*x[j];if(a[k][k]==0)return -1;else loft=w*loft/a[k][k];x[k]=x[k]+loft;printf("x[%d]=%10f \t",k,x[k]);if(fabs(loft)>comb)comb=fabs(loft);}printf("\n");}if(i>MaxK)return -2;elsereturn 1;}运行结果(w=1)及结果显示(3.1=ω):。