西安交通大学计算方法A上机作业

合集下载

计算方法上机报告_董晓壮

计算方法上机报告_董晓壮

计算方法A上机报告学院(系):电气工程学院学生姓名:陶然学号:授课老师:完成日期:2019年12月03日西安交通大学Xi'an Jiaotong University目录1 QR分解法求解线性方程组 (2)1.1 算法原理 (2)1.1.1 基于吉文斯变换的QR分解 (2)1.1.2 基于豪斯霍尔德变换的QR分解 (3)1.2 程序流程图 (4)1.2.1 基于吉文斯变换的QR分解流程图 (4)1.2.2 基于豪斯霍尔德变换的QR分解流程图 (5)1.3 程序使用说明 (5)1.3.1 基于吉文斯变换的QR分解程序说明 (5)1.3.2 基于豪斯霍尔德变换的QR分解程序说明 (7)1.4 算例计算结果 (8)2 共轭梯度法求解线性方程组 (10)2.1 算法原理 (10)2.2 程序流程图 (10)2.3 程序使用说明 (11)2.4 算例计算结果 (12)3 三次样条插值 (14)3.1 算法原理 (14)3.2 程序流程图 (16)3.3 程序使用说明 (17)3.4 算例计算结果 (19)4 龙贝格积分 (21)4.1 算法原理 (21)4.2 程序流程图 (22)4.3 程序使用说明 (23)4.4 算例计算结果 (24)结论 (26)1 QR 分解法求解线性方程组1.1 算法原理矩阵的QR 分解是指,可以将矩阵A 分解为一个正交矩阵Q 和一个上三角矩阵R 的乘积,实际中,QR 分解经常被用来解决线性最小二乘问题,分解情况如图1.1所示。

=⨯图1.1 QR 分解示意图本次上机学习主要进行了两个最基本的正交变换—吉文斯(Givens )变换和豪斯霍尔德(Householder )变换,并由此导出矩阵的QR 分解以及求解线性方程组的的方法。

1.1.1 基于吉文斯变换的QR 分解吉文斯矩阵也称初等旋转阵,如式(1.1)所示,它把n 阶单位矩阵I 的第,i j 行的对角元改为c ,将第i 行第j 列的元素改为s ,第j 行第i 列的元素改为s −后形成的矩阵。

西安交通大学计算方法B大作业

西安交通大学计算方法B大作业

计算方法上机报告姓名:学号:班级:目录题目一------------------------------------------------------------------------------------------ - 4 -1.1题目内容 ---------------------------------------------------------------------------- - 4 -1.2算法思想 ---------------------------------------------------------------------------- - 4 -1.3Matlab源程序----------------------------------------------------------------------- - 5 -1.4计算结果及总结 ------------------------------------------------------------------- - 5 - 题目二------------------------------------------------------------------------------------------ - 7 -2.1题目内容 ---------------------------------------------------------------------------- - 7 -2.2算法思想 ---------------------------------------------------------------------------- - 7 -2.3 Matlab源程序---------------------------------------------------------------------- - 8 -2.4计算结果及总结 ------------------------------------------------------------------- - 9 - 题目三----------------------------------------------------------------------------------------- - 11 -3.1题目内容 --------------------------------------------------------------------------- - 11 -3.2算法思想 --------------------------------------------------------------------------- - 11 -3.3Matlab源程序---------------------------------------------------------------------- - 13 -3.4计算结果及总结 ------------------------------------------------------------------ - 14 - 题目四----------------------------------------------------------------------------------------- - 15 -4.1题目内容 --------------------------------------------------------------------------- - 15 -4.2算法思想 --------------------------------------------------------------------------- - 15 -4.3Matlab源程序---------------------------------------------------------------------- - 15 -4.4计算结果及总结 ------------------------------------------------------------------ - 16 - 题目五----------------------------------------------------------------------------------------- - 18 -5.1题目内容 --------------------------------------------------------------------------- - 18 -5.2算法思想 --------------------------------------------------------------------------- - 18 -5.3 Matlab源程序--------------------------------------------------------------------- - 18 -5.3.1非压缩带状对角方程组------------------------------------------------- - 18 -5.3.2压缩带状对角方程组---------------------------------------------------- - 20 -5.4实验结果及分析 ------------------------------------------------------------------ - 22 -5.4.1Matlab运行结果 ---------------------------------------------------------- - 22 -5.4.2总结分析------------------------------------------------------------------- - 24 -5.5本专业算例 ------------------------------------------------------------------------ - 24 - 学习感悟-------------------------------------------------------------------------------------- - 27 -题目一1.1题目内容计算以下和式:0142111681848586n n S n n n n ∞=⎛⎫=--- ⎪++++⎝⎭∑,要求: (1)若保留11个有效数字,给出计算结果,并评价计算的算法; (2)若要保留30个有效数字,则又将如何进行计算。

(完整word版)计算方法A上机实验报告

(完整word版)计算方法A上机实验报告

计算方法A上机实验报告姓名:苏福班级:硕4020 学号:3114161019一、上机练习目的1)复习和巩固数值计算方法的基本数学模型,全面掌握运用计算机进行数值计算的具体过程及相关问题。

2)利用计算机语言独立编写、调试数值计算方法程序,培养学生利用计算机和所学理论知识分析解决实际问题的能力。

二、上机练习任务1)利用计算机语言编写并调试一系列数值方法计算通用程序,并能正确计算给定题目,掌握调试技能。

2)掌握文件使用编程技能,如文件的各类操作,数据格式设计、通用程序运行过程中文件输入输出运行方式设计等。

3)写出上机练习报告。

三、上机题目1. 共轭梯度法求解线性方程组。

(第三章)2. 三次样条插值(第四章)3. 龙贝格积分(第六章)4. 四阶龙格-库塔法求解常微分方程的初值问题四、上机报告题目1:共轭梯度法求解线性方程组1.算法原理共轭梯度法是把求解线性方程组的问题转化为求解一个与之等价的二次函数极小值的问题。

从任意给定的初始点出发,沿一组关于矩阵A共轭的方向进行线性搜索,在无舍入误差的假定下,最多迭代n 次(其中n 为矩阵A 的阶数),就可求得二次函数的极小值,也就求得了线性方程组Ax b =的解。

定理:设A 是n 阶对称正定矩阵,则x *是方程组Ax b =的解得充分必要条件是x *是二次函数1()2TT f x x Ax b x =-的极小点,即 ()()min nx R Ax b f x f x **∈=⇔=共轭梯度法的计算公式:(0)(0)(0)()()()()(1)()()(1)(1)(1)()()()(1)(1)()k T k k k T k k k k k k k k T k k k T k k k k k d r b Ax r d d Ad xx d r b Ax r Ad d Ad d r d ααββ++++++⎧==-⎪⎪=⎪⎪=+⎪⎨=-⎪⎪⎪=-⎪⎪=+⎩2. 程序框图(1)编写共轭梯度法求解对称正定矩阵的线性方程组见附录(myge.m):function x=myge(A,b)输入对称正定矩阵及对应的列向量,初始向量设为0,精度取为810 。

计算方法上机题答案

计算方法上机题答案

2.用下列方法求方程e^x+10x-2=0的近似根,要求误差不超过5*10的负4次方,并比较计算量(1)二分法(局部,大图不太看得清,故后面两小题都用局部截图)(2)迭代法(3)牛顿法顺序消元法#include<stdio.h>#include<stdlib.h>#include<math.h>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<N ;i++ )for (j=0;j<N+1; j++ )scanf("%lf",&a[i][j]);for(p=0;p<N-1;p++) {for(k=p+1;k<N;k++){m=a[k][p]/a[p][p];for(q=p;q<N+1;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:nif abs(A(i,k))>max1max1=abs(A(i,k));r=i;endendif max1<1e-10flag='failure';return;endif r>kfor j=k:nz=A(k,j);A(k,j)=A(r,j);A(r,j)=z;endz=b(k);b(k)=b(r);b(r)=z;det=-det; endfor i=k+1:nm=A(i,k)/A(k,k);for j=k+1:nA(i,j)=A(i,j)-m*A(k,j);endb(i)=b(i)-m*b(k);enddet=det*A(k,k);enddet=det*A(n,n)if abs(A(n,n))<1e-10flag='failure';return;endx(n)=b(n)/A(n,n);for k=n-1:-1:1for j=k+1:nb(k)=b(k)-A(k,j)*x(j);endx(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;endyn高斯赛德尔迭代法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;endynSOR迭代法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;endyn1.分段线性插值:function y=fdxx(x0,y0,x)p=length(y0);n=length(x0);m=length(x);for i=1:mz=x(i);for j=1:n-1if z<x0(j+1)break;endendy(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));endend结果0.39404 0.38007 0.356932.分段二次插值:function y=fdec(x0,y0,x)p=length(y0);n=length(x0);m=length(x);for i=1:mz=x(i);for j=1:n-1if z<x0(j+1)break;endendif j<2j=j+1;elseif (j<n-1)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;endendans=0.0;for t=j-1:j+1a=1.0;for k=j-1:j+1if t~=ka=a*(z-x0(k))/(x0(t)-x0(k));endendans=ans+a*y0(t);endy(i)=ans;fprintf('y(%d)=%f\n x1=%.3f y1=%.3f\n x2=%.3f y2=%.3f\n x3=%.3f y3=%.3f\n\n',i,y(i),x0(j-1),y0(j-1),x0(j),y0(j),x0(j+1),y0(j+1));endend结果为0.39447 0.38022 0.357253.拉格朗日全区间插值function y=lglr(x0,y0,x)p=length(y0);n=length(x0);m=length(x);for t=1:mans=0.0;z=x(t);for k=1:np=1.0;for q=1:nif q~=kp=p*(z-x0(q))/(x0(k)-x0(q));endendans=ans+p*y0(k);endy(t)=ans;fprintf('y(%d)=%f\n',t,y(t));endend结果为0.39447 0.38022 0.35722function [p,S,mu] = polyfit(x,y,n)if ~isequal(size(x),size(y))errorendx = x(:);y = y(:);if nargout > 2mu = [mean(x); std(x)];x = (x - mu(1))/mu(2);endV(:,n+1) = ones(length(x),1,class(x));for j = n:-1:1V(:,j) = x.*V(:,j+1);end[Q,R] = qr(V,0);ws = warning;p = R\(Q'*y); warning(ws);if size(R,2) > size(R,1)warning;elseif warnIfLargeConditionNumber(R)if nargout > 2warning;elsewarning;endendif nargout > 1r = y - V*p;S.R = R;S.df = max(0,length(y) - (n+1));S.normr = norm(r);endp = p.';function flag = warnIfLargeConditionNumber(R) if isa(R, 'double')flag = (condest(R) > 1e+10);elseflag = (condest(R) > 1e+05);endx=[1,3,4,5,6,7,8,9,10];y=[10,5,4,2,1,1,2,3,4];p=polyfit(x,y,2);y=poly2sym(p);a=-p(1)/p(2)*0.5;xa=-p(2)/(2*p(1));min=(4*p(1)*p(3)-p(2)^2)/(4*p(1)); yxamin运行截图运行结果function [I] = CombineTraprl(f,a,b,eps)if(nargin ==3)eps=1.0e-4;endn=1;h=(b-a)/2;I1=0;I2=(subs(sym(f),findsym(sym(f)),a)+subs(sym(f),findsym(sym(f)),b))/h; while abs(I2-I1)>epsn=n+1;h=(b-a)/n;I1=I2;I2=0;for i=0:n-1x=a+h*i;x1=x+h;I2=I2+(h/2)*(subs(sym(f),findsym(sym(f)),x)+subs(sym( f),findsym(sym(f)),x1));endendI=I2;程序:>> [q]=CombineTraprl('(1-exp(-x))^0.5/x'10^-12,1)结果:q =1.8521欧拉方法function [x,y]=euler(fun,x0,xfinal,y0,n);if nargin<5,n=50;endh=(xfinal-x0)/n;x(1)=x0;y(1)=y0;for i=1:nx(i+1)=x(i)+h;y(i+1)=y(i)+h*feval(fun,x(i),y(i));end程序:[x,y]=euler('doty',0,1,1,10)结果:改进欧拉方法function [x,y]=eulerpro(fun,x0,xfinal,y0,n); if nargin<5,n=50;endh=(xfinal-x0)/n;x(1)=x0;y(1)=y0;x(i+1)=x(i)+h;y1=y(i)+h*feval(fun,x(i),y(i));y2=y(i)+h*feval(fun,x(i+1),y1);y(i+1)=(y1+y2)/2;end程序:>> [x,y]=eulerpro('doty',0,1,1,10)结果:经典RK法function [x,y]=RungKutta4(dyfun,xspan,y0,h) x=xspan(1):h:xspan(2);y(1)=y0;for n=1:length(x)-1k1=feval(dyfun,x(n),y(n));k2=feval(dyfun,x(n)+h/2,y(n)+h/2*k1);k3=feval(dyfun,x(n)+h/2,y(n)+h/2*k2);k4=feval(dyfun,x(n+1),y(n)+h*k3);y(n+1)=y(n)+h*(k1+2*k2+2*k3+k4)/6; end程序:dyfun=inline('(2*x*y^-2)/3');[x,y]=RungKutta4(dyfun,[0,1],1,0.1)标准函数x(1)=0;h=0.1;for i=1:10y(i)=(1+x(i)^2)^(1/3); endxY结果:。

计算方法上机作业集合

计算方法上机作业集合

第一次&第二次上机作业上机作业:1.在Matlab上执行:>> 5.1-5-0.1和>> 1.5-1-0.5给出执行结果,并简要分析一下产生现象的原因。

解:执行结果如下:在Matlab中,小数值很难用二进制进行描述。

由于计算精度的影响,相近两数相减会出现误差。

2.(课本181页第一题)解:(1)n=0时,积分得I0=ln6-ln5,编写如下图代码从以上代码显示的结果可以看出,I 20的近似值为0.7465(2)I I =∫I I 5+I 10dx,可得∫I I 610dx ≤∫I I 5+I 10dx ≤∫I I 510dx,得 16(I +1)≤I I ≤15(I +1),则有1126≤I 20≤1105, 取I 20=1105,以此逆序估算I 0。

代码段及结果如下图所示(3)从I20估计的过程更为可靠。

首先根据积分得表达式是可知,被积函数随着n的增大,其所围面积应当是逐步减小的,即积分值应是随着n的递增二单调减小的,(1)中输出的值不满足这一条件,(2)满足。

设I I表示I I的近似值,I I-I I=(−5)I(I0−I0)(根据递推公式可以导出此式),可以看出,随着n的增大,误差也在增大,所以顺序估计时,算法不稳定性逐渐增大,逆序估计情况则刚好相反,误差不断减小,算法逐渐趋于稳定。

2.(课本181页第二题)(1)上机代码如图所示求得近似根为0.09058 (2)上机代码如图所示得近似根为0.09064;(3)牛顿法上机代码如下计算所得近似解为0.09091第三次上机作业上机作业181页第四题线性方程组为[1.13483.83260.53011.78751.16513.40172.53301.54353.41294.93171.23714.99988.76431.314210.67210.0147][I1I2I3I4]=[9.53426.394118.423116.9237](1)顺序消元法A=[1.1348,3.8326,1.1651,3.4017;0.5301,1.7875,2.5330,1.5435;3.4129,4.9317,8.7643,1.3142;1.2371,4.9998,10.6721,0.0147]; b=[9.5342;6.3941;18.4231;16.9237];上机代码(函数部分)如下function [b] = gaus( A,b )%用b返回方程组的解B=[A,b];n=length(b);RA=rank(A);RB=rank(B);dif=RB-RA;if dif>0disp('此方程组无解');returnendif RA==RBif RA==nformat long;disp('此方程组有唯一解');for p=1:n-1for k=p+1:nm=B(k,p)/B(p,p);B(k,p:n+1)=B(k,p:n+1)-m*B(p,p:n+1);endend %顺序消元形成上三角矩阵b=B(1:n,n+1);A=B(1:n,1:n);b(n)=b(n)/A(n,n);for q=n-1:-1:1b(q)=(b(q)-sum(A(q,q+1:n)*b(q+1:n)))/A(q,q);end %回代求解elsedisp('此方程组有无数组解');endend上机运行结果为>>A=[1.1348,3.8326,1.1651,3.4017;0.5301,1.7875,2.5330,1.5435;3.4129,4.9317,8.7643,1.3142;1.2371,4.9998,10.6721,0.0147]; b=[9.5342;6.3941;18.4231;16.9237];>> X=gaus(A,b)此方程组有唯一解X =1.00001.00001.00001.0000>>(2)列主元消元法A=[1.1348,3.8326,1.1651,3.4017;0.5301,1.7875,2.5330,1.5435;3.4129,4.9317,8.7643,1.3142;1.2371,4.9998,10.6721,0.0147]; b=[9.5342;6.3941;18.4231;16.9237];函数部分代码如下function [b] = lieZhu(A,b )%用b返回方程组的解B=[A,b];RA=rank(A);RB=rank(B);n=length(b);dif=RB-RA;format long;if dif>0disp('该方程组无解');returnendif dif==0if RA==ndisp('该方程组有唯一解');c=zeros(1,n);for i=1:n-1max=abs(A(i,i));m=i;for j=i+1:nif max<abs(A(j,i))max=abs(A(j,i));m=j;endend %求出每一次消元时绝对值最大的一行的行号 if m~=ifor k=i:nc(k)=A(i,k);A(i,k)=A(m,k);A(m,k)=c(k);endd1=b(i);b(i)=b(m);b(m)=d1;%函数值跟随方程一起换位置endfor k=i+1:nfor j=i+1:nA(k,j)=A(k,j)-A(i,j)*A(k,i)/A(i,i);endb(k)=b(k)-b(i)*A(k,i)/A(i,i);A(k,i)=0;endend %完成消元操作,形成上三角矩阵b(n)=b(n)/A(n,n);for i=n-1:-1:1sum=0;for j=i+1:nsum=sum+A(i,j)*b(j);endb(i)=(b(i)-sum)/A(i,i) ;%回代求解其他未知数endendelsedisp('此方程组有无数组解');endend上机运行,结果为>>A=[1.1348,3.8326,1.1651,3.4017;0.5301,1.7875,2.5330,1.5435;3.4129,4.9317,8.7643,1.3142;1.2371,4.9998,10.6721,0.0147]; b=[9.5342;6.3941;18.4231;16.9237];X=lieZhu(A,b)该方程组有唯一解X =1.00001.00020.99990.9999>>根据两种方法运算结果,顺序消元法得到结果比列主元消元法得到的结果精度更高。

西安交大并行计算作业

西安交大并行计算作业

并行计算与程序设计作业班级:姓名:学号:1.1至1.3节作业1.调试课件中的所有程序,并完成作业,同时在程序结果中需要输出个人信息;代码:Program mainwrite(*,*)'班级:', 'write(*,*)'姓名:',' 'print *,'学号:',''end2.编写一个数值求解方程的程序,方程为4.1x3 −5.3x=11.8,求解区间为(1,5),误差小于1e-6。

代码:a=1b=5if(f(a)*f(b).LT.0) thenwrite(*,*)'inter:(',a,',',b,')'Loop1: do while((abs(f(a)-f(b)).gt.10e-6).and.$ (abs(a-b).gt.10e-6))c=(a+b)/2if(f(a)*f(c).le.0)thenb=celsea=cend ifend do Loop1write(*,*)'x=',celsewrite(*,*)'Please input real interval'end ifendreal function f(x)f=4.1*x**3-5.3*x-11.8end结果:1.4节作业1.采样简单离散求和法求下面积分值:∫x2sin(x)+1dx 1代码:read(*,*) a,b,nh=(b-a)/(2.0*n)s=0.0x=a+hf2=0.0f4=0.0loop1: do i=1,n-1x=x+hf2=f2+f(x)x=x+hf4=f4+f(x)end do loop1s=h/3.0*(f(a)+f(b)+4.0*f4+2.0*f2)write(*,150) s100 format(1x,'a=',f8.2,2x,'b=',f8.2,$ 2x,'n=',i4)150 format(1x,'s=',f16.7)endreal function f(x)f=x**2/(sin(x)+1)endd ouble precision i,ai,ydouble precision sum=0i=1do 10 while(1/sum=1/i+sumi=i+110 continuewrite(*,*) 'sum=',sumend结果:1.6节作业1.调试课本中的所有程序;(结果略)2.用双精度型数据计算:∑1i=11+12+13+⋯+1nni=1直到1n≤10−5代码:double precision sum=0i=1do 10 while(1/sum=1/i+sumi=i+110 continuewrite(*,*) 'sum=',sumend结果:3.已知三角形三个顶点的坐标分别为A(1.5,2.5),B(-2.5,1), C(1,-1),采用复型数据类型求三角形的面积和重心。

西安交大计算方法A考点总结【1-9章】

西安交大计算方法A考点总结【1-9章】
k
x* xk 0
计算方法 A 知识点总结 仅供参考[2014 级化机]
矩阵收敛的充要条件是 lim
k
A* Ak 0
lim Bk 0 谱半径 B 1
k
2、迭代法的一般格式 3、雅克比迭代
xk 1 Bxk g (注:B 是个对角元素均为 0 的方阵)
i 1 n bi aij xjk 1 aij xjk ) j 1 j i
SOR 迭代格式(加松弛因子 w) : xi 变形为 xSOR
k 1 k 1 1 xk xG S
k 1
xik rik 1 / aii
改进平方根法:A=LU=LDLT 比平方根法多了 5、追赶法(三对角方程组) 本质是三对角矩阵的 LU 分解。 6、向量范数
x
非负性;齐性;三角不等式。
x1 x
2
元素绝对值之和; 元素平方和的平方根; 元素绝对值的最大值;
x
7、矩阵范数
A
非负性;齐性;三角不等式;相容性。
A1 A2
列范数(第 1 到第 n 列元素绝对值之和的最大值) 谱范数( AT A 的特征值的最大值的平方根) 行范数(第 1 行到第 n 行元素绝对值之和之和的最大值)
Dxk 1 1 Dxk Exk 1 Fxk b


1)迭代法收敛的充分条件:迭代矩阵 B 的范数 2)迭代法收敛的充要条件: lim B
k k
B 1
0 谱半径 B 1
3)超松弛迭代法收敛的必要条件是: 0 2
计算方法 A 知识点总结 仅供参考[2014 级化机]
第一章 1、误差的来源与分类:模型误差、观测误差、截断误差、舍入误差。 2、准确到 n 位小数:

西安交通大学算法上机实验报告

西安交通大学算法上机实验报告

《计算机算法设计与分析》上机实验报告姓名:班级:学号:日期:2016年12月23日算法实现题3-14 最少费用购物问题★问题描述:商店中每种商品都有标价。

例如,一朵花的价格是2元,一个花瓶的价格是5元。

为了吸引顾客,商店提供了一组优惠商品价。

优惠商品是把一种或多种商品分成一组,并降价销售。

例如,3朵花的价格不是6元而是5元。

2个花瓶加1朵花的优惠价格是10元。

试设计一个算法,计算出某一顾客所购商品应付的最少费用。

★算法设计:对于给定欲购商品的价格和数量,以及优惠价格,计算所购商品应付的最少费用。

★数据输入:由文件input.txt提供欲购商品数据。

文件的第1行中有1个整数B(0≤B≤5),表示所购商品种类数。

在接下来的B行中,每行有3个数C,K和P。

C表示商品的编码(每种商品有唯一编码),1≤C≤999;K表示购买该种商品总数,1≤K≤5;P是该种商品的正常单价(每件商品的价格),1≤P≤999。

请注意,一次最多可购买5*5=25件商品。

由文件offer.txt提供优惠商品价数据。

文件的第1行中有1个整数S(0≤S≤99),表示共有S种优惠商品组合。

接下来的S行,每行的第1个数描述优惠商品组合中商品的种类数j。

接着是j个数字对(C,K),其中C是商品编码,1≤C≤999;K表示该种商品在此组合中的数量,1≤K≤5。

每行最后一个数字P (1≤P≤9999)表示此商品组合的优惠价。

★结果输出:将计算出的所购商品应付的最少费用输出到文件output.txt。

输入文件示例输出文件示例Input.txt offer.txt output.txt2 2 147 3 2 1 7 3 58 2 5 2 7 1 8 2 10解:设cost(a,b,c,d,e)表示购买商品组合(a,b,c,d,e)需要的最少费用。

A[k],B[k],C[k],D[k],E[k]表示第k种优惠方案的商品组合。

offer (m)是第m种优惠方案的价格。

西安交大计算方法上机报告

西安交大计算方法上机报告

从而得到计算的公式:
j 1, 2,..., n 1 j 1 j l i1 i 2,3,..., n i1 11 i 1 lik ukj j i , i 1,..., n, i 2,3,.., n ij ij k 1 i 1 1 l ( lkt ti ) k i 1,..., n, i 2,3,.., n ki ki t 1 ii
计算方法 上机实习题目报告
班级:材料 s3076 班 姓名:丁明帅 学号:3113305029
1:计算 S
100000

k 1
1 ,要求误差小于 106 ,给出实现算法。 k2
【实现思路】
设当 k 值为 i 时 S-Si<10-6,则只需要
S Si

100000 1
k i
1
2
1 l32 ln 2 1 ln 3 1
4 / 46
12 22
1n 2 n

nn
因此有
1 j 2 j 0 jj 0 0
ij li1
li 2
li ,i -1
根据定义知道 L 矩阵的斜对角线上的值都为 1,且 L 矩阵的第一行与原矩阵 A 的第一行 相同,因此可以根据公式先计算 U 的第一行,然后计算 L 的第一列;以后的第 i 步先计算 U 的第 i 行, 然后计算 L 的第 i 列 (U 的第 n 行不作计算) 。 然后把最后的 U 的第 n 行计算出来。
【算法依据】
列主元高斯消元法的过程可以将方程组系数简化为系数矩阵与 b 矩阵, 从而利用方程组 对系数扩展矩阵进行消元。 在消元的过程中矩阵的行向量之间可以变换, 但列向量不能变化。 在进行压缩矩阵的求解中还需要人为的将因调整行向量所导致的列向量的变化调整回来。 Matlab 对于矩阵的处理非常容易,结合 for 循环语句可以实验本题大规模方程组的求解。

计算方法上机大作业

计算方法上机大作业

绪论1.用二分法求方程x3-x-1=0在[1,2]内的近似根,要求误差不超10-3. 程序:clc;cleara=1;b=2;fa=a*a*a-a-1;fb=b*b*b-b-1;c=(a+b)/2;fc=c*c*c-c-1;if fa*fb>0,break,endwhile abs(fc)>10^(-3)c=(a+b)/2;fc=c*c*c-c-1;if fb*fc>0b=c;fb=fc;elsea=c;fa=fc;endendformat longfx=fc,x=c运算结果:fx =-4.659488331526518e-05x =1.3247070312500002.证明方程f(x)=e x+10x-2=0内在[0,1]内有唯一实根,用二分法求这一实根,要求误差不超过0.5*10-2.证明:由题可知,f’(x)在[0,1]上为正,也就是f(x)单调递增,又因为f(0)<0,f(1)>0,所以在[0,1]内有唯一实根。

程序:clc;cleara=0;b=1;fa=exp(a)+10*a-2;fb=exp(b)+10*b-2;c=(a+b)/2;fc=exp(c)+10*c-2;if fa*fb>0,break,endwhile abs(fc)>0.5*10^(-2)c=(a+b)/2;fc=exp(c)+10*c-2;if fb*fc>0b=c;fb=fc;elsea=c;fa=fc;endendformat longfx=fc,x=c运算结果:fx = 0.003275341789827 x =0.090820312500000第一章11.给出概率积分dx ey xx22⎰-=π的数据表i 0 1 2 3 xi 0.46 0.47 0.48 0.49 yi0.48465550.49374520.50274980.5116683用二次插值计算,试问:(1)当x=0.472时该积分值等于多少? 程序: clear all;x=[0.46 0.47 0.48 0.49];y=[0.4846555 0.4937452 0.5027498 0.5116683]; xi=0.472;yi=interp1(x,y,xi,'linear'); yi 运算结果:yi = 0.495546120000000(2)当x 为何值时积分值等于0.5? 程序:clear all;x=[0.46 0.47 0.48 0.49];y=[0.4846555 0.4937452 0.5027498 0.5116683];yi=0.5;xi=interp1(y,x,yi,'linear');xi运算结果:xi =0.47694622748373134.构造适合下列数据表的三次插值样条S(x):x -1 0 1 2 y -1 1 3 5 y’ 6 1 程序:function [ ]=spline31(X,Y,dY,x0,m)N=size(X,2);s0=dY(1); sN=dY(2);interval=0.025;disp('x0为插值点')h=zeros(1,N-1);for i=1:N-1 h(1,i)=X(i+1)-X(i);endd(1,1)=6*((Y(1,2)-Y(1,1))/h(1,1)-s0)/h(1,1);d(N,1)=6*(sN-(Y(1,N)-Y(1,N-1))/h(1,N-1))/h(1,N-1);for i=2:N-1d(i,1)=6*((Y(1,i+1)-Y(1,i))/h(1,i)-(Y(1,i)-Y(1,i-1))/h(1,i-1))/(h(1,i)+h(1,i-1));endmu=zeros(1,N-1); md=zeros(1,N-1);md(1,N-1)=1; mu(1,1)=1;for i=1:N-2u=h(1,i+1)/(h(1,i)+h(1,i+1)); mu(1,i+1)=u;md(1,i)=1-u;endp(1,1)=2; q(1,1)=mu(1,1)/2;for i=2:N-1p(1,i)=2-md(1,i-1)*q(1,i-1); q(1,i)=mu(1,i)/p(1,i);endp(1,N)=2-md(1,N-1)*q(1,N-1);y=zeros(1,N); y(1,1)=d(1)/2;for i=2:N y(1,i)=(d(i)-md(1,i-1)*y(1,i-1))/p(1,i);endx=zeros(1,N); x(1,N)=y(1,N);for i=N-1:-1:1 x(1,i)=y(1,i)-q(1,i)*x(1,i+1);endfprintf ('M为三对角方程的解\n');M=x;fprintf ('\n');syms t;digits (m);for i=1:N-1pp(i)=M(i)*(X(i+1)-t)^3/(6*h(i))+M(i+1)*(t-X(i))^3/(6*h(i))+(Y(i)-M(i)*h(i)^2/6)*(X(i+1)-t)/h(i);+(Y(i+1)-M(i+1)*h(i)^2/6)*(x-X(i))/h(i);pp(i)=simplify(pp(i)); coeff=sym2poly(pp(i));if length(coeff)~=4tt=coeff(1:3); coeff(1:4)=0; coeff(2:4)=tt;endif x0>X(i)&&x0<X(i+1) L=i;y0=coeff(1)*x0^3+coeff(2)*x0^2+coeff(3)*x0+coeff(4); endval=X(i):interval:X(i+1);for k=1:length(val)fval(k)=coeff(1)*val(k)^3+coeff(2)*val(k)^2;+coeff(3)*val(k)+coeff(4);endif mod(i,2)==1 plot(val,fval,'r+')else plot(val,fval,'b.')endhold onclear val fvalans=sym(coeff,'d');ans=poly2sym(ans,'t');fprintf('在区间[%f,%f]内\n',X(i),X(i+1));fprintf('三次样条函数S(%d)=',i);pretty(ans);endX=[-1 0 1 3];Y=[-1 1 3 5];dY=[6 1];x0=1.2;m=5;spline31(X,Y,dY,x0,m)运行结果:在区间[-1.000000,0.000000]内三次样条函数S(1)= 3.0 t3 + 2.0 t2 + 0.66667 t + 0.66667 在区间[0.000000,1.000000]内三次样条函数S(2)= - 1.0 t3 + 2.0 t 2 - 2.3333 t + 1.0在区间[1.000000,3.000000]内三次样条函数S(3)=0.25 t 3- 1.75 t 2+ 2.5833 t + 1.9167第二章PPT题目:编写一通用型复化辛甫生公式。

应用数学系研究生课程介绍(西安交通大学)

应用数学系研究生课程介绍(西安交通大学)

研究生课程介绍课程编码:091002课程名称:计算方法(A)Computational Methods (A)学分:3课内总学时数:72上机(实验)学时数:18课程内容简介:本课程讲授电子计算机上使用的各种基本的数值计算方法, 如插值法, 最小二乘法, 最佳一致逼近, 数值微积分, 方程求根法, 线性与非线性代数方程组解法, 矩阵特征值与特征向量求法, 常微分方程初值问题的解法, 求解数理方程定解问题的差分法, 有限元法等. 书中重点讨论了各种计算方法的构造原理和使用, 对稳定性, 收敛性, 误差估计等也作了适当讨论. 本课程适合于计算数学专业以外的理工科各专业研究生学习。

先修课:高等数学, 线性代数, C 语言或FORTRAN 语言参考书目:1. 邓建中,刘之行编, 计算方法,西安交通大学出版社,2002执笔人:梅立泉、李乃成、高静审定人:彭济根课程编码:091003课程名称:计算方法(B)Computational Methods (B)学分:3课内总学时数:54上机(实验)学时数:48课程内容简介:由于现代计算机技术的迅速发展,数值方法已成为科学研究的最重要的手段之一。

本课程在介绍数值计算的基本问题,包括浮点数、误差形成等的基础上,主要介绍:线性方程组的直接解法与迭代解法、离散数据的连续化处理(包括多项式插值、分段插值和最小二乘法)、数值积分和数值导数、非线性方程解法简介、常微分方程数值解法、以及最优化方法简介。

通过听课与相应的上机练习等途径,理解数值方法的形成原理,掌握最基本的数值方法,了解采用数值方法时应注意的主要问题,为以后在科研和工程技术工作中设计算法、应用数值软件进行数值计算奠定必要的基础。

先修课:高等数学、线性代数、算法语言(Fortran、C、C++、或Matlab 等)参考书目:1.凌永祥、陈明逵编,计算方法教程(第二版)西安交通大学出版社,2005执笔人:黄昌斌、苏剑、马军审定人:彭济根课程名称:工程优化方法及其应用Engineering Optimization Methods and Its Applications学分:2课内总学时数:40上机(实验)学时数:课程内容简介:讲述工程优化的数学基础,凸集、凸函数、凸规划的基本概念与基本理论;突出非线性规划各类算法的共性分析及其在计算机上可实现的步骤,并指出每类算法中所包含各种常用和著名算法;简介工程中常用到的几类特殊规划,如:线性规划、二次规划、几何规划和多目标规划的基本概念、常用和最新算法;简介工程优化设计应用实例(包括建立优化模型,根据模型特点构造或选用相适应的算法、计算流程图)。

西安交通大学计算方法A上机作业

西安交通大学计算方法A上机作业

计算方法(A)大作业姓名:班级:专业:学号:共轭梯度法一、算法原理共轭梯度法是把求解线性方程组的问题转化为求解一个与之等价的二次函数极小化的问题,因此从任意给定的初始点出发,沿一组关于矩阵A的共轭方向进行线性搜索,在无舍入无差的假定下,最多迭代n(其中n为矩阵A的阶数)次就可求得二次函数的极小点,也就求得了线性方程组Ax=B的解。

下述定理给出了求系数矩阵A是对称正定矩阵的线性方程组Ax=b的解与求二次函数f(x)=12x T Ax−b T x极小点的等价性。

定理3.4.1设A是n阶对称正定矩阵,则x∗是方程组Ax=b的解的充分必要条件是x∗是二次函数f(x)=12x T Ax−b T x的极小点,即Ax∗=b⟺f(x∗)=minx∈R nf(x)证明:充分性.设x∗是f(x)的极小点,则由无约束最优化问题最优解的必要条件知∇f(x∗)=Ax∗−b即x∗是方程组Ax=b的解。

必要性. 若x∗是方程组Ax=b的解,即A x∗=b,注意到A是对称正定矩阵,故∀x∈R n有f(x)−f(x∗)=12x T Ax−b T x−12x T Ax∗+b T x∗=12(x T Ax−2b T x+x∗T Ax∗)−x∗T Ax∗+b T x∗=12(x T Ax−2(Ax∗)T x+x∗T Ax∗)−(Ax∗−b)T x∗=12(x−x∗)T A(x−x∗)≥0即x∗是f(x)的极小点,进而由A是正定矩阵知,x∗是f(x)的最小点。

证毕。

共轭梯度法在形式上具有迭代法的特征,在给定初始值情况下,根据迭代公式:x(k+1)=x(k)+αk d(k)产生的迭代序列x(1),x(2),x(3)…在无舍入误差假定下,最多经过n次迭代,就可求得f(x) 的最小值,也就是方程Ax=b的解。

共轭梯度法中关键的两点是,确定迭代格式中的搜索向量d(k)和最佳步长αk (αk≥0)。

实际上,搜索方向d(k)是关于矩阵A的共轭向量,在迭代中逐步构造之。

计算方法A2013

计算方法A2013

A = G������ ������ ,并求出方程组的解。 三、(7 分)已知函数 y f ( x) 的函数值、导数值如下: (部分函数值可能记得有出入)
x
y ( x)
y ( x )
0 1
1 2
2 4
计算方法 A
2013 年 1 月
2
11
求满足条件的 Hermite 插值多项式及截断误差表示式 四、(7 分)求函数 y e x 在区间[−1,1]上的最优平方逼近二次多项式。 1 五、(8 分)对线性方程组 Ax b ;其中A = [ 4a 都收敛的 a 的范围; 六、(8 分)设方程式������ 3 − 3x + 1 = 0在[1,2]内的 1.5 附近有根。 (1) 试说明迭代序列������k+1 = 3 (������������ 3. + 1)是否收敛; (2) 用松弛加速技术改善迭代,使得对(1)中的迭代由不收敛变为收敛,或者 加速收敛; 七、对高斯型求积分公式, I[f] = ∫−1 ������(x)dx, Q[f] = ������0 ������(������0 ) + ������1 ������(������1 ),且已知勒让德 正交二次多项式为������2 (x) = 3������ 2 − 1; (1) 试确定������0 ,������1 ,������0 ,������1 ,使得求积公式 I f Q f 具备最高的代数精度,并 且给出截断误差表达式; (2) 应用上面的公式求积分∫0 √1 + 2xdx; 八、给定高阶微分方程初值问题{ ������ ′′′ − 2������ ′′ + 4������ ′ − 4 sin ������ = 0 ,取步长为 h,试给出 ������(0) = 0, ������ ′ (0) = 0

西安交通大学 计算方法上机报告

西安交通大学 计算方法上机报告

计算方法上机报告姓名:学号:班级:机械硕4002上课班级:02班说明:本次上机实验使用的编程语言是Matlab 语言,编译环境为MATLAB 7.11.0,运行平台为Windows 7。

1. 对以下和式计算:∑∞⎪⎭⎫ ⎝⎛+-+-+-+=0681581482184161n n n n S n,要求:① 若只需保留11个有效数字,该如何进行计算; ② 若要保留30个有效数字,则又将如何进行计算;(1) 算法思想1、根据精度要求估计所加的项数,可以使用后验误差估计,通项为: 142111416818485861681n n n a n n n n n ε⎛⎫=---<< ⎪+++++⎝⎭; 2、为了保证计算结果的准确性,写程序时,从后向前计算; 3、使用Matlab 时,可以使用以下函数控制位数: digits(位数)或vpa(变量,精度为数)(2)算法结构1. ;0=s⎪⎭⎫⎝⎛+-+-+-+=681581482184161n n n n t n; 2. for 0,1,2,,n i =⋅⋅⋅ if 10m t -≤end;3. for ,1,2,,0n i i i =--⋅⋅⋅;s s t =+(3)Matlab源程序clear; %清除工作空间变量clc; %清除命令窗口命令m=input('请输入有效数字的位数m='); %输入有效数字的位数s=0;for n=0:50t=(1/16^n)*(4/(8*n+1)-2/(8*n+4)-1/(8*n+5)-1/(8*n+6));if t<=10^(-m) %判断通项与精度的关系break;endend;fprintf('需要将n值加到n=%d\n',n-1); %需要将n值加到的数值for i=n-1:-1:0t=(1/16^i)*(4/(8*i+1)-2/(8*i+4)-1/(8*i+5)-1/(8*i+6));s=s+t; %求和运算ends=vpa(s,m) %控制s的精度(4)结果与分析当保留11位有效数字时,需要将n值加到n=7,s =3.1415926536;当保留30位有效数字时,需要将n值加到n=22,s =3.14159265358979323846264338328。

西安交通大学计算方法上机作业

西安交通大学计算方法上机作业

计算方法上机作业1.对以下和式计算:0142118184858616n n S n n n n ∞=⎛⎫=--- ⎪++++⎝⎭∑,要求: (1)若只需保留11个有效数字,该如何进行计算; (2)若要保留30个有效数字,则又将如何进行计算;(1)解题思想和算法实现:根据保留有效位数的要求,可以由公式得出计算精度要求。

只需要很少内存,时间复杂度和d 呈线性,不需要高浮点支持。

先根据while 语句求出符合精度要求的n 值的大小,然后利用for 语句对这n 项进行求和,输出计算结果及n 值大小即可。

(2)matlab 源程序:保留11位有效数字时; clear clcformat long n=0;sum=1/(16^n)*(4/(8*n+1)-2/(8*n+4)-1/(8*n+5)-1/(8*n+6)); while sum>=5*10^(-11); n=n+1;sum=1/(16^n)*(4/(8*n+1)-2/(8*n+4)-1/(8*n+5)-1/(8*n+6)); endfor i=0:n-1;sum=sum+1/(16^i)*(4/(8*i+1)-2/(8*i+4)-1/(8*i+5)-1/(8*i+6)); endvpa(sum,11) n保留30位有效数字时; clear clcformat long n=0;sum=1/(16^n)*(4/(8*n+1)-2/(8*n+4)-1/(8*n+5)-1/(8*n+6)); while sum>=5*10^(-30); n=n+1;sum=1/(16^n)*(4/(8*n+1)-2/(8*n+4)-1/(8*n+5)-1/(8*n+6)); endfor i=0:n-1;sum=sum+1/(16^i)*(4/(8*i+1)-2/(8*i+4)-1/(8*i+5)-1/(8*i+6)); endvpa(sum,30) n(3)实验结果分析图1.1 保留11位有效数字的n值及计算结果图图1.2 保留30位有效数字的n值及计算结果图由计算结果可知,通过合理的误差控制,分别通过7次和22次循环,可以实现题目所要求的精确度。

西安交通大学工程分析程序设计Fortran上机作业参考答案

西安交通大学工程分析程序设计Fortran上机作业参考答案

. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . .
. . . . . . . .
. . . . .
1
8 指 针 、格 式化 输入 /输 出、 文件 操作 8.1 格式化输入输出 . . . . . . . . . 8.1.1 整数 . . . . . . . . . . . 8.1.2 实数 . . . . . . . . . . . 8.1.3 复数 . . . . . . . . . . . 8.1.4 逻辑型 . . . . . . . . . . 8.1.5 字符串 . . . . . . . . . . 8.2 输出金字塔形状 . . . . . . . . . 8.3 整齐的杨辉三角形 . . . . . . . 8.4 龙格-库塔法求解微分方程 . . . 8.5 Shell排序 . . . . . . . . . . . . 9 参考文献 10 LICENSE
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算方法(A)大作业姓名:班级:专业:学号:共轭梯度法一、算法原理共轭梯度法是把求解线性方程组的问题转化为求解一个与之等价的二次函数极小化的问题,因此从任意给定的初始点出发,沿一组关于矩阵A的共轭方向进行线性搜索,在无舍入无差的假定下,最多迭代n(其中n为矩阵A的阶数)次就可求得二次函数的极小点,也就求得了线性方程组Ax=B的解。

下述定理给出了求系数矩阵A是对称正定矩阵的线性方程组Ax=b的解与求二次函数f(x)=12x T Ax−b T x极小点的等价性。

定理3.4.1设A是n阶对称正定矩阵,则x∗是方程组Ax=b的解的充分必要条件是x∗是二次函数f(x)=12x T Ax−b T x的极小点,即Ax∗=b⟺f(x∗)=minx∈R nf(x)证明:充分性.设x∗是f(x)的极小点,则由无约束最优化问题最优解的必要条件知∇f(x∗)=Ax∗−b即x∗是方程组Ax=b的解。

必要性. 若x∗是方程组Ax=b的解,即A x∗=b,注意到A是对称正定矩阵,故∀x∈R n有f(x)−f(x∗)=12x T Ax−b T x−12x T Ax∗+b T x∗=12(x T Ax−2b T x+x∗T Ax∗)−x∗T Ax∗+b T x∗=12(x T Ax−2(Ax∗)T x+x∗T Ax∗)−(Ax∗−b)T x∗=12(x−x∗)T A(x−x∗)≥0即x∗是f(x)的极小点,进而由A是正定矩阵知,x∗是f(x)的最小点。

证毕。

共轭梯度法在形式上具有迭代法的特征,在给定初始值情况下,根据迭代公式:x(k+1)=x(k)+αk d(k)产生的迭代序列x(1),x(2),x(3)…在无舍入误差假定下,最多经过n次迭代,就可求得f(x) 的最小值,也就是方程Ax=b的解。

共轭梯度法中关键的两点是,确定迭代格式中的搜索向量d(k)和最佳步长αk (αk≥0)。

实际上,搜索方向d(k)是关于矩阵A的共轭向量,在迭代中逐步构造之。

步长αk的确定原则是给定迭代点x(k)和搜索方向d(k)后,要求选取非负实数αk,使得f(x(k)+αk d(k))达到最小,即选择αk,满足f(x(k)+αk d(k))=min0≤αf(x(k)+αd(k))下面首先导出最佳步长k的计算公式。

假设迭代点x(k)和搜索方向d(k)已经给定,αk可以通过一元函数∅(α)=f(x(k)+αd(k))的极小化min∅(α)=0≤αf(x(k)+αd(k))来求得,根据多元复合函数的求导法则得:∅́(α)=∇f(x(k)+αd(k))T d(k)令0=∅́(α)=∇f(x(k)+αd(k))T d(k)=[A(x(k)+αd(k))−b]T d(k)=(Ax(k)−b+αAd(k))T d(k)=(−r(k)+αAd(k))T d(k)其中r(k)=b−Ax(k)。

由此解得最佳步长αk=r(k)T d(k)d(k)T Ad(k)(3.4.4)下面确定搜索方向d(k)。

给定初始向量x(0)后,由于负梯度方向是函数下降最快的方向,故第1次迭代取搜索方向d(0)=r(0)=−∇f(x(0))=b−Ax(0)。

令x(1)=x(0)+α0d(0)其中α0=r(0)T d(0)d(0)T Ad(0)。

第2次迭代时,从x(1)出发的搜索方向不再取r(1),而是选取d(1)=r(1)+β0d(0),使得d(1)与d(0)是关于矩阵A的共轭向量,即要求d(1)满足(d(1),Ad(0))=0,由此可求得参数β0:β0=−r(1)T Ad(0) d(0)T Ad(0)然后从x(1)出发,沿d(1)进行搜索得到x(2)=x(1)+α1d(1)其中α1由式(3.4.4)确定。

一般地,设已经求出x(k+1)=x(k)+αk d(k),计算r(k+1)=b−Ax(k+1)。

令d(k+1)=r(k+1)+βk d(k),选取βk,使得d(k+1)和d(k)是关于A的共轭向量,即要求d(k+1)满足(d(k+1),Ad(k))=0。

由此可得:βk=−r(k+1)T Ad(k) d Ad从而确定了搜索方向d(k+1)。

综上所述,共轭梯度法的计算公式为d(0)=r(0)=b−Ax(0),αk=r(k)T d(k)d(k)T Ad(k),x(k+1)=x(k)+αk d(k),r(k+1)=b−Ax(k+1),βk=−r(k+1)T Ad(k)d(k)T Ad(k),d(k+1)=r(k+1)+βk d(k).利用定理3.4.3,可以将αk和βk的表达式简化为αk=r(k)T r(k) d Adβk=r(k+1)T r(k+1) r(k)T r(k)定理3.4.3设分别是共轭梯度法中产生的非零残向量和搜索方向,则(1)(r(k),d(k−1))=0(2)(r(k),d(k))=(r(k),r(k))(3)r(0), r(1),…, r(k)(k≤n−1)是正交向量组,d(0), d(1),…, d(k)(k≤n−1)是关于A的共轭向量组。

关于共轭向量法的误差有如下定理:定理3.4.5设是用共轭梯度法求得的迭代序列,则有误差估计式‖x(k)−x∗‖A ≤2(√K)k‖x(0)−x∗‖A其中范数‖x‖A=T,K=Cond2(A).若r(k)=0,则x(k)就是线性方程组的解,故在计算过程中将‖r(k+1)‖≤ε作为迭代终止的条件。

共轭梯度法的计算过程如下:(1)给定初始近似向量x(0)以及精度ε>0;(2)计算r(0)=b−Ax(0),取d(0)=r(0);(3)for k=0 to n-1 do(i)αk =r(k)T d(k)d(k)T Ad(k);(ii)x(k+1)=x(k)+αk d(k);(iii)r(k+1)=b−Ax(k+1);(iv)若‖r(k+1)‖≤ε或k+1=n,则输出近似解x(k+1),停止;否则,转(v);(v )βk =‖r (k+1)‖22‖r (k)‖22;(vi )d (k+1)=r (k+1)+βk d (k); end do计算经验表明,对于不是十分病态的问题,共轭梯度法收敛较快,迭代次数远小于矩阵的阶数n 。

对于病态问题,只要进行足够多次的迭代(迭代次数大约为矩阵阶数n 的3-5倍)后,一般也能得到满意的结果,因而共轭梯度法是求解高阶稀疏线性方程组的一个有效、常用的方法。

二、 程序框图三、程序使用说明及案例计算结果程序使用说明本共轭梯度法求解线性方程的程序需要用户给定对称正定矩阵A的阶数,误差以及初始向量,然后程序自动调用定义的函数Gongetidu(A,b,x0,epsa)实现求解线性方程组Ax=b。

其中A,b的阶数,初始向量x0和epsa都是可变的。

案例计算结果可以发现,当n=100,200,300时,方程组Ax=b的解x为元素均为1的n阶向量。

四、Matlab程序(M-文件)clear A b x0;clc; %程序运行前首先清除A,b和X0的数值,以免影响计算n=input('请输入对称正定矩阵A的阶数n=');epsa=input('请输入误差=');A=zeros(0,0); %给矩阵A预先配置内存空间,减少耗时for k=1:(n-1) %读取题目3.2的矩阵AA(k,k)=-2;A(k,k+1)=1;A(k+1,k)=1;endA(n,n)=-2;A;b(1,1)=-1; %读取题目3.2的矩阵bb(n,1)=-1;b;x0(1,1)=input('假定初始向量各元素相同,均为:'); %给题目3.2的迭代过程赋初值for kk=2:nx0(kk,1)=x0(1,1);endx=Gongetidu(A,b,x0,epsa); %调用共轭梯度法求线性方程组的函数function x=Gongetidu(A,b,x0,epsa)n=size(A,1);x=x0;r=b-A*x;d=r;for k=0:(n-1)alpha=(r'*r)/(d'*A*d);x=x+alpha*d;r2=b-A*x;if ((norm(r2)<=epsa)||(k==n-1))disp('方程组的近似解为x=');disp(x);break;endbeta=norm(r2)^2/norm(r)^2;d=r2+beta*d;r=r2;endend三次样条插值三、算法原理分段低次插值多项式的一阶或二阶导数不连续,不能满足许多实际问题的要求。

例如,在飞机机翼外形设计,船体放样等许多实际问题中,要求曲线二阶光滑,即要求函数的二阶导数连续。

为了将一些已知点连成一条充分光滑的曲线,早期的做法是绘图人员用压铁把一条称为样条的富有弹性的细木条或金属条固定在相邻的若干点上,然后沿样条画下一条所需的光滑曲线,这条曲线称为样条曲线。

实际上,它是由分段三次曲线拼接而成的,在连接点处二阶导数连续。

将样条曲线抽象为数学问题称为样条函数。

1、三次样条插值函数的定义设在区间[a,b]上给定n+1个节点x i(a≤x0<x1<⋯<x n≤b),在节点x i处的函数值y i=f(x i)(i=0,1,⋯,n)。

若函数S(x)满足以下三条:(1)在每个子区间[x i−1,x i]上,S(x)是三次多项式;(2)是个S(x i)=y i(i=0,1,⋯,n);(3)在区间[a,b]上,S(x)的二阶导数S(x)连续,则称S(x)为函数y=f(x)在区间[a,b]上的三次样条插值函数。

由定义可知,S(x)是分段三次多项式,故在每个子区间[x i−1,x i] (i=1,⋯,n)上,S(x)有4个待定参数,共有n个子区间,所以S(x)共有4n个待定参数。

根据定义中的条件(3)知S−(x i)=S+(x i),S−(x i)=S+(x i),i=1,2,⋯,n−1.S−(x i)=S+(x i),上式共有3n-3个条件,再加上定义条件(2)中的n+1个条件,共有4n-2个条件。

还需要增加两个条件才能确定4n个待定参数,即才能确定S(x)。

所增加的条件称为边界条件或端点条件。

三种常用的边界条件如下:(1)已知f(x)在区间[a,b]的两端点a,b处的二阶导数值f(a),f(b);(2)已知f(x)在区间[a,b]的两端点a,b处的一阶导数值f(a),f(b);(3)已知函数f(x)式以T=b-a为周期的周期函数。

2、三次样条插值函数的导出1)导出在子区间[x i−1,x i](i=1,2,⋯,n)上的S(x)的表达式由于S(x)的二阶导数连续,设S(x)在节点x i处的二阶导数值S(x i)=M i(i= 1,2,⋯,n),其中M i为未知的待定参数。

相关文档
最新文档