计算方法上机题答案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.用下列方法求方程e^x+10x-2=0的近似根,要求误差不超过5*10的负4次方,并比较计算量
(1)二分法
(局部,大图不太看得清,故后面两小题都用局部截图)
(2)迭代法
(3)牛顿法
顺序消元法
#include
#include
#include
int main()
{ int N=4,i,j,p,q,k; double m;
double a[4][5]; double x1,x2,x3,x4; for (i=0;i for (j=0;j scanf("%lf",&a[i][j]); for(p=0;p for(k=p+1;k { m=a[k][p]/a[p][p]; for(q=p;q a[k][q]=a[k][q]-m*a[p][q]; } } x4=a[3][4]/a[3][3]; x3=(a[2][4]-x4*a[2][3])/a[2][2]; x2=(a[1][4]-x4*a[1][3]-x3*a[1][2])/a[1][1]; x1=(a[0][4]-x4*a[0][3]-x3*a[0][2]-x2*a[0][1])/a[0][0]; printf("%f,%f,%f,%f",x1,x2,x3,x4); scanf("%lf",&a[i][j]); (这一步只是为了看到运行的结果)} 运行结果 列主元消元法 function[x,det,flag]=Gauss(A,b) [n,m]=size(A);nb=length(b); flag='OK';det=1;x=zeros(n,1); for k=1:n-1 max1=0; for i=k:n if abs(A(i,k))>max1 max1=abs(A(i,k));r=i; end end if max1<1e-10 flag='failure';return; end if r>k for j=k:n z=A(k,j);A(k,j)=A(r,j);A(r,j)=z; end z=b(k);b(k)=b(r);b(r)=z;det=-det; end for i=k+1:n m=A(i,k)/A(k,k); for j=k+1:n A(i,j)=A(i,j)-m*A(k,j); end b(i)=b(i)-m*b(k); end det=det*A(k,k); end det=det*A(n,n) if abs(A(n,n))<1e-10 flag='failure';return; end x(n)=b(n)/A(n,n); for k=n-1:-1:1 for j=k+1:n b(k)=b(k)-A(k,j)*x(j); end x(k)=b(k)/A(k,k); end 运行结果: 雅可比迭代法function y=jacobi(a,b,x0) D=diag(diag(a)); U=-triu(a,1); L=-tril(a,-1); B=D\(L+U); f=D\b; y=B*x0+f;n=1; while norm(y-x0)>1e-4 x0=y; y=B*x0+f;n=n+1; end y n 高斯赛德尔迭代法function y=seidel(a,b,x0) D=diag(diag(a)); U=-triu(a,1); L=-tril(a,-1); G=(D-L)\U; f=(D-L)\b; y=G*x0+f;n=1; while norm(y-x0)>10^(-4) x0=y; y=G*x0+f;n=n+1; end y n SOR迭代法 function y=sor(a,b,w,x0) D=diag(diag(a)); U=-triu(a,1); L=-tril(a,-1); lw=(D-w*L)\((1-w)*D+w*U); f=(D-w*L)\b*w; y=lw*x0+f;n=1; while norm(y-x0)>10^(-4) x0=y; y=lw*x0+f;n=n+1; end y n 1.分段线性插值: function y=fdxx(x0,y0,x) p=length(y0);n=length(x0);m=length(x); for i=1:m z=x(i); for j=1:n-1 if z break; end end y(i)= y0(j)*(z-x0(j+1))/(x0(j)-x0(j+1))+y0(j+1)*(z-x0(j))/(x0(j+1)-x0(j)); fprintf('y(%d)=%f\nx1=%.3fy1=%.3f\nx2=%.3fy2=%.3f\n\n',i,y(i),x0(j),y0(j),x0(j+1),y0(j+1)); end end 结果0.39404 0.38007 0.35693 2.分段二次插值: function y=fdec(x0,y0,x) p=length(y0);n=length(x0);m=length(x); for i=1:m z=x(i); for j=1:n-1 if z break; end end if j<2 j=j+1; elseif (j if (abs(x0(j)-z)>abs(x0(j+1)-z)) j=j+1; elseif ((abs(x0(j)-z)==abs(x0(j+1)-z))&&(abs(x0(j-1)-z)>abs(x0(j+2)-z))) j=j+1;