数值分析资料报告计算实习题

合集下载

数值分析计算实习题二

数值分析计算实习题二

《数值分析》计算实习题二算法设计方案1.主要计算步骤:计算函数f(x,y)在拟合所需的节点处的函数值。

将各拟合节点(x i,y j)分别带入非线性方程组0.5 cos t + u + v + w – x = 2.67t + 0.5 sin u + v + w – y = 1.070.5t + u + cos v + w – x =3.74t + 0.5u + v + sin w – y =0.79解非线性方程组得解向量(t ij,u ij,v ij,w ij)。

对数表z(t,u)进行分片二次代数插值,求得对应(t ij,u ij)处的值,即为f(x i,y j) 的值。

对上述拟合节点分别进行x,y最高次数为k(k=0,1,2,3…)次的多项式拟合。

每次拟合后验证误差大小,直到满足要求。

2.求解非线性方程组选择Newton迭代法,迭代过程中需要求解线性方程组,选择选主元的Doolittle分解法。

3.对z(t,u)进行插值选择分片二次插值。

4.拟合基函数φr(x)ψs(y)选择为φr(x)=x r,ψs(y)=y s。

拟合系数矩阵c通过连续两次解线性方程组求得。

一.源程序#include "stdio.h"#include "stdlib.h"#include "math.h"void Doolittle(double *A,int n,int *M)//功能说明:对n阶矩阵A进行选主元的Doolittle分解//参数说明:A:欲进行分解的方阵,同时也是返回参数,分解后的结果// 存储于A中// n:方阵A的维数// M;(返回参数)n维向量,记录选主元过程中行交换的次序{int i,j,k,t;double *s;double Maxs,temp;s=(double*) calloc(n,sizeof(double));for(k=0;k<n;k++){for(i=k;i<n;i++){s[i]=A[i*n+k];for(t=0;t<k;t++) s[i]-= A[i*n+t] * A[t*n+k];}Maxs=abs(s[k]); M[k]=k;for(i=k+1;i<n;i++){if(Maxs<abs(s[i])){Maxs=abs(s[i]);M[k]=i;}}if(M[k]!=k){for(t=0;t<n;t++){temp=A[k*n+t];A[k*n+t]=A[M[k]*n+t];A[M[k]*n+t]=temp;}temp=s[k];s[k]=s[M[k]];s[M[k]]=temp;}if(Maxs<(1e-14)){s[k]=1e-14;printf("%.16e方阵奇异\n",Maxs);}A[k*n+k]=s[k];for(j=k+1;(j<n)&&(k<n-1);j++){for(t=0;t<k;t++) A[k*n+j]-=A[k*n+t]*A[t*n+j];A[j*n+k]=s[j]/A[k*n+k];}}}void Solve_LUEquation(double* A,int n,double* b,double* x) //功能说明:解方程LUx=b,其中L、U共同存储在A中//参数说明:A:经Doolittle分解后的方阵// n:方阵A的维数// b:方程组的右端向量// x:(返回参数)方程组的解向量{int i,t;for(i=0;i<n;i++){x[i]=b[i];for(t=0;t<i;t++) x[i]-=A[i*n+t]*x[t];}for(i=n-1;i>-1;i--){for(t=i+1;t<n;t++) x[i]-=A[i*n+t]*x[t];x[i]/=A[i*n+i];}}void Transpose(double *A,int m,int n,double* AT)//功能说明:求m×n阶矩阵A的转置AT//参数说明:A:已知m×n阶矩阵// m:A的行数// n:A的列数// AT:(返回参数)A的转置矩阵(n×m){int i,j;for(i=0;i<m;i++)for(j=0;j<n;j++) AT[j*m+i]=A[i*n+j];}void Solve_LEquation(double* A,int n,double* B,double* x,int m) //功能说明:解线性方程组Ax=B,该函数可对系数矩阵相同// 而右端向量不同的多个方程组同时求解。

北航数值分析计算实习题目二 矩阵QR分解

北航数值分析计算实习题目二 矩阵QR分解

数值分析实习二院(系)名称航空科学与工程学院专业名称动力工程及工程热物理学号SY0905303学生姓名解立垚1. 题目试用带双步位移QR 的分解法求矩阵A=[a ij ]10*10的全部特征值,并对其中的每一个实特征值求相应的特征向量。

已知()sin 0.50.2,1.5cos 1.2,ij i j i j a i j i j ⎧⎫+≠⎪⎪=⎨⎬+=⎪⎪⎩⎭(),1,2,...,10i j =。

说明:1、求矩阵特征值时,要求迭代的精度水平为1210ε-=。

2、打印以下内容:算法的设计方案;全部源程序(要求注明主程序和每个子程序的功能); 矩阵A 经过拟上三角话之后所得的矩阵()1n A -;对矩阵()1n A-进行QR 分解方法结束后所得的矩阵;矩阵A 的全部特征值()(),1,2,......10i i iR I i λ=,和A 的相应于实特征值的特征向量;其中()(),.i e i m i R R I I λλ==如果i λ是实数,则令0.i I =3、采用e 型输出数据,并且至少显示12位有效数字。

2. 算法设计方案本题采用带双步位移的QR 分解方法。

为了使程序简洁,自定义类Xmatrix ,其中封装了所需要的函数方法。

在Xmatrix 类中封装了运算符重载的函数,即定义了矩阵的加、减、乘、除、数乘运算及转置运算(T())。

同时为了避免传递数组带来的额外内存开销,使用引用(&)代替值传递,以节省内存空间,避免溢出.(1)此程序的主要部分为Xmatrix 中的doubleQR()方法,具体如下:Step1:使用矩阵拟上三角化的算法将A 化为拟上三角阵A (n-1)(此处调用Xmatrix 中的preQR()方法)Step2:令121,,10k m n ε-===, 其中k 为迭代次数。

Step3:如果,1m m a ε-≤,则得到A 的一个特征值,m m a ,令1m m =-,goto Step4;否则goto Step5.Step4: 如果1m =,则得到A 的一个特征值11a ,goto Step11;如果0m =,则goto Step11;如果1m >,则goto Step3;Step5(Step6):如果2m =,则得到A 的两个特征值12s s 和(12s s 和为右下角两阶子阵对应的特征方程21,1,()det 0m m m m a a D λλ---++=的两个根。

北航数值分析计算实习1

北航数值分析计算实习1

《数值分析》计算实习题目110091013 劳云杰一、算法设计方案根据提示的算法,首先使用幂法求出按模最大的特征值λt1,再根据已求出的λt1用带原点平移的幂法求出另一个特征值λt2,比较两个λ的大小,根据已知条件,可以得出λ1和λ501.至于λs,由于是按模最小的特征值,使用反幂法求之,由于反幂法需要解线性方程组,故对矩阵进行Doolittle分解。

再通过带原点平移的反幂法求跟矩阵的与数最接近的特征值。

对非奇异的矩阵A,根据条件数定义,取λt1/λs的绝对值,两个特征值在之前步骤中均以求得。

由于对矩阵进行了Doolittle分解,所以矩阵的行列式det A可由分解得出的上三角阵U 的对角线上元素相乘求得。

为了使A的所有零元素都不存储,使用书本25页的压缩存储法对A进行存储,在计算时通过函数在数组C中检索A中元素即可。

由于A是501*501矩阵,C应取为5*501矩阵。

由于数据不大,为了方便起见,在程序中取502*502矩阵或者502向量,C也取为6*502矩阵。

程序编写参考《数值分析》颜庆津著和[C数值算法].(美国)W ILLIAM.H.P RESS.扫描版。

二、全部源程序#include <stdio.h>#include <math.h>#define XS 1.0e-12//精度水平void fz_a();//对矩阵A赋值double js(int,int);//在压缩矩阵中检索A的元素double mf(double);//幂法double fmf(double);//反幂法int lu(double);//Doolittle分解int jfc(double[],double[]);//解方程int max(int,int);int min(int,int);double (*u)[502]=new double[502][502];//上三角阵double (*l)[502]=new double[502][502];//单位下三角阵double a[6][502];//压缩存储矩阵int max(int x,int y)//比大小函数×2{ return (x>y?x:y);}int min(int x,int y)//精度关系,比较下标用{ return (x<y?x:y);}int main(){printf("请耐心等待,先看看中间过程吧~\n");int i,k;double ldt1,ldt2,ld1,ld501,lds,mu[40],det;double ld[40];fz_a();//对A赋值ldt1=mf(0);//幂法求模最大的特征值ldt2=mf(ldt1);//以第一次求得的特征值进行平移ld1=ldt1<ldt2?ldt1:ldt2;//大的就是λ501ld501=ldt1<ldt2?ldt2:ldt1;lu(0);lds=fmf(0);//反幂法求λsdet=1;//初始化行列式for(i=1;i<=501;i++)det=det*u[i][i];//用U的对角元素求行列式for(k=1;k<=39;k++){mu[k]=ld1+k*(ld501-ld1)/40;//与数lu(mu[k]);ld[k]=fmf(mu[k]);}printf("\n 列出结果\n");printf("λ1=%1.12e λ501=%1.12e\n",ld1,ld501);printf("λs=%1.12e \n",lds);printf("cond(A)=%1.12e \n",fabs(ldt1/lds));printf("detA=%1.12e \n",det);for(k=1;k<=39;k++)//列出跟与数最接近特征值{printf("λi%d=%1.12e\t",k,ld[k]);if(k%2==0)printf("\n");}//界面友好性delete []u;delete []l;getchar();return 0;}void fz_a()//对A赋值{int i;for(i=3;i<=501;i++)a[1][i]=a[5][502-i]=-0.064;//原A矩阵的cfor(i=2;i<=501;i++)a[2][i]=a[4][502-i]=0.16;//原A矩阵的bfor(i=1;i<=501;i++)a[3][i]=(1.64-0.024*i)*sin(0.2*i)-0.64*exp(0.1/i);//原对角线元素}double js(int i,int j)//对压缩矩阵检索A的元素{if(abs(i-j)<=2)return a[i-j+3][j];else return 0;}double mf(double offset)//幂法{int i,x1;double u[502],y[502];double beta=0,prebeta=-1000,yita=0;//用幂法的第一种迭代方法for(i=1;i<=501;i++) //用到了2-范数u[i]=1,y[i]=0;for(int k=1;k<=10000;k++)//对迭代次数进行限制{yita=0;for(i=1;i<=501;i++)yita=sqrt(yita*yita+u[i]*u[i]);for(i=1;i<=501;i++)y[i]=u[i]/yita;for(x1=1;x1<=501;x1++){u[x1]=0;for(int x2=1;x2<=501;x2++)u[x1]=u[x1]+((x1==x2)?(js(x1,x2)-offset):js(x1,x2))*y[x2];}prebeta=beta;beta=0;for(i=1;i<=501;i++)beta=beta+y[i]*u[i];if(fabs((prebeta-beta)/beta)<=XS){printf("offset=%f lb=%f err=%e k=%d\n",offset,(beta+offset),fabs((prebeta-beta)/beta),k);break;};}//满足误差条件后,迭代终止,并输出平移量,误差和迭代次数return(beta+offset);//加上平移量,方便比较}double fmf(double offset)//反幂法{ int i;double u[502],y[502];double beta=0,prebeta=0,yita=0;for(i=1;i<=501;i++)u[i]=1,y[i]=0; //相关量初始化for(int k=1;k<=10000;k++)//限制迭代次数{yita=0;for(i=1;i<=501;i++)yita=sqrt(yita*yita+u[i]*u[i]);for(i=1;i<=501;i++)y[i]=u[i]/yita;jfc(u,y);prebeta=beta;beta=0;for(i=1;i<=501;i++)beta=beta+y[i]*u[i];beta=1/beta;if(fabs((prebeta-beta)/beta)<=XS){printf("offset=%f lb=%f err=%ek=%d\n",offset,(beta+offset),fabs((prebeta-beta)/beta),k);break;};}//满足误差条件后,迭代终止,并输出平移量,误差和迭代次数return(beta+offset);}int lu(double offset)//Doolittle分解{int i,j,k,t;double sum;//中间量for(k=1;k<=501;k++)for(j=1;j<=501;j++){u[k][j]=l[k][j]=0;if(k==j)l[k][j]=1;}//对LU矩阵初始化for(k=1;k<=501;k++)//对式(2.12)的程序实现{for(j=k;j<=min(k+2,501);j++){sum=0;for(t=max(1,max(k-2,j-2));t<=(k-1);t++)sum=sum+l[k][t]*u[t][j];//j=k,k+1,……,nu[k][j]=((k==j)?(js(k,j)-offset):js(k,j))-sum;}if(k==501)continue;for(i=k+1;i<=min(k+2,501);i++)//i=k+1,……,n{sum=0;for(t=max(1,max(i-2,k-2));t<=(k-1);t++)sum=sum+l[i][t]*u[t][k];l[i][k]=(((i==k)?(js(i,k)-offset):js(i,k))-sum)/u[k][k];}}return 0;}int jfc(double x[],double b[])//解方程{int i,t;double y[502];double sum;y[1]=b[1];for(i=2;i<=501;i++){sum=0;for(t=max(1,i-2);t<=i-1;t++)sum=sum+l[i][t]*y[t];y[i]=b[i]-sum;}x[501]=y[501]/u[501][501];for(i=500;i>=1;i--){sum=0;for(t=i+1;t<=min(i+2,501);t++)sum=sum+u[i][t]*x[t];x[i]=(y[i]-sum)/u[i][i];}return 0;}三、结果λ1=-1.070011361502e+001λ501=9.724634098777e+000λs=-5.557910794230e-003cond(A)=1.925204273902e+003detA=2.772786141752e+118λi1=-1.018293403315e+001 λi2=-9.585707425068e+000 λi3=-9.172672423928e+000λi4=-8.652284007898e+000 λi5=-8.0934********e+000 λi6=-7.659405407692e+000λi7=-7.119684648691e+000 λi8=-6.611764339397e+000 λi9=-6.0661********e+000λi10=-5.585101052628e+000 λi11=-5.114083529812e+000 λi12=-4.578872176865e+000λi13=-4.096470926260e+000 λi14=-3.554211215751e+000 λi15=-3.0410********e+000 λi16=-2.533970311130e+000 λi17=-2.003230769563e+000 λi18=-1.503557611227e+000 λi19=-9.935586060075e -001 λi20=-4.870426738850e -001 λi21=2.231736249575e -002 λi22=5.324174742069e -001 λi23=1.052898962693e+000 λi24=1.589445881881e+000 λi25=2.060330460274e+000 λi26=2.558075597073e+000 λi27=3.080240509307e+000 λi28=3.613620867692e+000 λi29=4.0913********e+000 λi30=4.603035378279e+000 λi31=5.132924283898e+000 λi32=5.594906348083e+000 λi33=6.080933857027e+000 λi34=6.680354092112e+000 λi35=7.293877448127e+000 λi36=7.717111714236e+000 λi37=8.225220014050e+000 λi38=8.648666065193e+000 λi39=9.254200344575e+000四、讨论迭代初始向量的选取对计算结果的影响1.在反幂法中取迭代向量u[1]=1,u[i]=0,i=2,……,501,最后得出的结果中λs=2.668886923785e -002,cond(A)也随之改变成4.009204556274e+0022.在幂法中取迭代向量u[1]=1,u[i]=2,i=2,……,501,最后得出的结果不变。

数值分析计算实习题

数值分析计算实习题

数值分析计算实习题-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN《数值分析》计算实习题姓名:学号:班级:第二章1、程序代码Clear;clc;x1=[ ];y1=[ ];n=length(y1);c=y1(:);for j=2:n %求差商for i=n:-1:jc(i)=(c(i)-c(i-1))/(x1(i)-x1(i-j+1));endendsyms x df d;df(1)=1;d(1)=y1(1);for i=2:n %求牛顿差值多项式df(i)=df(i-1)*(x-x1(i-1));d(i)=c(i-1)*df(i);endP4=vpa(sum(d),5) %P4即为4次牛顿插值多项式,并保留小数点后5位数pp=csape(x1,y1, 'variational');%调用三次样条函数q=;q1=q(1,:)*[^3;^2;;1];q1=vpa(collect(q1),5)q2=q(1,:)*[^3;^2;;1];q2=vpa(collect(q2),5)q3=q(1,:)*[^3;^2;;1];q3=vpa(collect(q3),5)q4=q(1,:)*[^3;^2;;1];q4=vpa(collect(q4),5)%求解并化简多项式2、运行结果P4 =*x - *(x - *(x - - *(x - *(x - *(x - - *(x - *(x - *(x - *(x - + q1 =- *x^3 + *x^2 - *x +q2 =- *x^3 + *x^2 - *x + q3 =- *x^3 + *x^2 - *x + q4 =- *x^3 + *x^2 - *x +3、问题结果4次牛顿差值多项式4()P x = *x - *(x - *(x - - *(x - *(x - *(x - - *(x - *(x - *(x - *(x - +三次样条差值多项式()Q x0.10.20.30.40.50.60.70.80.910.40.50.60.70.80.911.1323232321.33930.803570.40714 1.04,[0.2,0.4]1.3393 1.60710.88929 1.1643,[0.4,0.6]1.3393 2.4107 1.6929 1.4171,[0.6,0.8]1.3393 3.21432.8179 1.8629,[0.8,1.0]x x x x x x x x x x x x x x x x ⎧-+-+∈⎪-+-+∈⎪⎨-+-+∈⎪⎪-+-+∈⎩第三章1、程序代码Clear;clc; x=[0 1]; y=[1 ];p1=polyfit(x,y,3)%三次多项式拟合 p2=polyfit(x,y,4)%四次多项式拟合 y1=polyval(p1,x);y2=polyval(p2,x);%多项式求值plot(x,y,'c--',x,y1,'r:',x,y2,'y-.')p3=polyfit(x,y,2)%观察图像,类似抛物线,故用二次多项式拟合。

数值分析课程实验设计——数值积分实习题

数值分析课程实验设计——数值积分实习题

数值分析——数值积分实习题管理科学与工程学院 学号:1120140500 姓名:彭洋洋 一、计算实习题1.用不同数值方法计算积分:049xdx =-⎰.(1)取不同的步长h ,分别用复合梯形及复合辛普森求积计算积分,给出误差中关于h 的函数,并与积分精确值比较两个公式的精度,是否存在一个最小的h ,使得精度不能再被改善? (2)用龙贝格求积计算完成问题(1) (3)用自适应辛普森积分,使其精度达到10-4解答:(1)取不同的步长,采用不同的公式,比较精度过程如下: 1.1 复合梯形公式及复合辛普森公式求解复合梯形公式:11*[()2()()]2n n k k hT f a f x f b -==++∑误差关于h 的函数:2(2)()**()12n a b R f h f ξ-=复合辛普森公式:111/201*[()4()2()()]6n n n k k k k hS f a f x f x f b --+===+++∑∑误差关于h 的函数:4(4)()*(/2)*()180n a bR f h f η-=1.2 复合梯形公式及复合辛普森公式Matlab 程序(2)用龙贝格求积计算完成问题(1) 2.1 龙贝格求积算法龙贝格求积公式也称为逐次分半加速法。

它是在梯形公式、辛普森公式和柯特斯公式之间的关系的基础上,构造出一种加速计算积分的方法。

作为一种外推算法,它在不增加计算量的前提下提高了误差的精度。

24133n n n S T T =- 21611515n n n C S S =- 26416363n n n R C C =-1221/201()22n n n k k h T T f x -+==+∑ ()(1)()11(4*)/(41)k m k k mm m m T T T +--=-- 1,2,...k = 2.2 龙贝格求积Matlab 程序画图程序设计①得到关于n各种公式求积的图表如下:对于梯形公式、辛普森公式n代表份数,龙贝格公式n表示从1开始的序列号②关于步长h 的各种公式求积的图表如下其中龙贝格序列步长()/2k h b a =-:观察两幅图表h 越小,精度越高。

数值分析(第五版)计算实习题第五章作业教学资料

数值分析(第五版)计算实习题第五章作业教学资料
(1)输入:
>> format compact
>> A=[3.01 6.03 1.99;1.27 4.16 -1.23;0.987 -4.81 9.34];
>> b=[1;1;1];
>> [RA,RB,n,X]=liezhu(A,b),h=det(A),C=cond(A)
输出:
请注意:因为RA=RB,所以方程组有唯一解
ans =
-9.5863 18.3741 -3.2258 3.5240
xX =
10.4661
jxX =
0.9842
Xgxx =
22.7396
xAb =
0.0076
xAbj =
0.0076
Acp =
2.9841e+03
第四题:
(1)输入:
建立m文件:
forn=2:6
a=hilb(n);
pnH(n-1)=cond(a,inf);
RA =
3
RB =
3
n =
3
X =
1.0e+03 *
1.5926
-0.6319
-0.4936
h =
-0.0305
C =
3.0697e+04
(2)输入:
>> A=[3.00 6.03 1.99;1.27 4.16 -1.23;0.990 -4.81 9.34];
>> b=[1;1;1];
>> [RA,RB,n,X]=liezhu(A,b),h=det(A)
>> r=b-H*X,deltax=X-x
输出:
X =

数值分析计算实习题

数值分析计算实习题

插值法1.下列数据点的插值x 0 1 4 9 16 25 36 49 64y 0 1 2 3 4 5 6 7 8可以得到平方根函数的近似,在区间[0,64] 上作图.(1)用这9 个点作8 次多项式插值Ls(x).(2)用三次样条( 第一边界条件)程序求S(x).从得到结果看在[0,64] 上,哪个插值更精确;在区间[0,1] 上,两种插值哪个更精确解:(1) 拉格朗日插值多项式,求解程序如下syms x l;x1=[0 1 4 9 16 25 36 49 64]; y1=[0 1 2 3 4 5 6 7 8]; n=length(x1);Ls=sym(0);for i=1:nl=sym(y1(i));for k=1:i-1l=l*(x-x1(k))/(x1(i)-x1(k));endfor k=i+1:n l=l*(x-x1(k))/(x1(i)-x1(k));endLs=Ls+l; endLs=simplify(Ls) % 为所求插值多项式Ls(x).输出结果为Ls = -/*xA2+95549/72072*x-1/00*xA8-2168879/0*xA4+19/0*xA7+657859/*xA3+33983/ 0*xA5-13003/00*xA6(2) 三次样条插值,程序如下x1=[0 1 4 9 16 25 36 49 64];y1=[0 1 2 3 4 5 6 7 8];x2=[0:1:64];y3=s plin e(x1,y1,x2);p=po Iyfit(x2,y3,3); % 得到三次样条拟合函数S=p(1)+p(2)*x+ p(3)*x^2+p(4)*xA3 % 得到S(x) 输出结果为:S =/6464-2399/88*x+/1984*xA2+2656867/624*xA3⑶ 在区间[0,64]上,分别对这两种插值和标准函数作图,Plot(x2,sqrt(x2),'b',x2,y2,'r',x2,y3,'y')蓝色曲线为y="X函数曲线,红色曲线为拉格朗日插值函数曲线,黄色曲线为三次样条插值曲线可以看到蓝色曲线与黄色曲线几乎重合,因此在区间[0,64] 上三次样条插值更精确。

数值分析计算实习题

数值分析计算实习题

插值法1.下列数据点的插值x 0 1 4 9 16 25 36 49 64y 0 1 2 3 4 5 6 7 8可以得到平方根函数的近似,在区间[0,64]上作图.(1)用这9个点作8次多项式插值Ls(x).(2)用三次样条(第一边界条件)程序求S(x).从得到结果看在[0,64]上,哪个插值更精确;在区间[0,1]上,两种插值哪个更精确?解:(1)拉格朗日插值多项式,求解程序如下syms x l;x1=[0 1 4 9 16 25 36 49 64];y1=[0 1 2 3 4 5 6 7 8];n=length(x1);Ls=sym(0);for i=1:nl=sym(y1(i));for k=1:i-1l=l*(x-x1(k))/(x1(i)-x1(k));endfor k=i+1:nl=l*(x-x1(k))/(x1(i)-x1(k));endLs=Ls+l;endLs=simplify(Ls) %为所求插值多项式Ls(x).输出结果为Ls =-24221063/63504000*x^2+95549/72072*x-1/3048192000*x^8-2168879/43545600 0*x^4+19/283046400*x^7+657859/10886400*x^3+33983/152409600*x^5-13003/2395 008000*x^6(2)三次样条插值,程序如下x1=[0 1 4 9 16 25 36 49 64]; y1=[0 1 2 3 4 5 6 7 8]; x2=[0:1:64];y3=spline(x1,y1,x2);p=polyfit(x2,y3,3); %得到三次样条拟合函数 S=p(1)+p(2)*x+p(3)*x^2+p(4)*x^3 %得到S(x) 输出结果为:S =23491/304472833/8*x+76713/*x^2+6867/42624*x^3(3)在区间[0,64]上,分别对这两种插值和标准函数作图,plot(x2,sqrt(x2),'b',x2,y2,'r',x2,y3,'y')蓝色曲线为y=函数曲线,红色曲线为拉格朗日插值函数曲线,黄色曲线为三次样条插值曲线010203040506070-2020406080100可以看到蓝色曲线与黄色曲线几乎重合,因此在区间[0,64]上三次样条插值更精确。

数值分析第五版计算实习题

数值分析第五版计算实习题

弟二草插值法3.卜列数据点的插值可以得到平方根函数的近似,在区间064]上作图。

(1〉用这9个点做8次多项式插值Q x)。

(2)用三次样条(第一边界条件)程岸求S(X)。

从得到结果石在[0.64] 1:・哪个插值更粘确:在区间[0,1] I:•两种插值哪个更精确?(1) 8次多项式插值:(1)8次多项式插值:首先建立新的M-file:输入如卜代码(此为拉格朗口插值的功能函数)并保存function f=Language(x,y,x0)%求Li知数据点的拉格朗Fl插值多项式%己知数据点的x坐标向量:x%已知数据点的y坐标向量:y%插值的x坐标:x0%求得的拉格朗H插值多项式或在X0处的插值:fsyms t;ifi(lcngth(x)=length(y))n=length(x);elsedisp(*x和y的维数不相等!);return;end %检错tbr(i=l:n)i=y(i);fbr(j=1:i-l)l=l*(t-x(j))/(x(i)-x(j));end;for(j=i-M:n)end;for(j=i+l:n) l=l*(t-x(j))/(x(i)-x(j)); end;simplify(f);if(i==n) if|nargin=3)f=subs(C't\xO);else f=collcct(f);f=vpa(f,6);endendend再建立新的M-file:输入:clear;x=[0 1 49 16 25 36 49 64];y=[0:l:8];%计算拉格朗口基丞数%计算拉格朗ri插值函数%化简%计算插值点的曲数值%将插值多项式展开%将插值多项式的系数化成6位精度的小数f=Uinguage(x,y) 运行得到f=1.32574*1-381410*t A2+.604294e-1 *t A3+.222972e-3 *t A5-.542921 e-5*t A6+.671268e・7T7・.328063e・9T8・.498071 e-2*t A4 这就是8次多项式插值L s(x)= 1.32574怜.381410*t A2+.604294e-1 *t A3+.222972e-3 *t A5-.542921 e-5*t A6+.671268e-7*t A7-.328063e-9*t A8-.498071 e-2*t A4. (2)三次样条插值:建立新的M-filc:输入:clear;x=[0 I 49 1625 36 4964];尸[0:8];t=[0:0.1:64];Y=t.A(0.5);O=Language(x,y)f= 1,32574*t-.381410*t.A2+.604294e-1 *t.A3+.222972e-3*t.A5-.542921 e・5*(. W+.671268e-7*t.A7-.328063e-9*t.A8-.498071 e-2 *t.A4;S=interp l(x,y,t.'spline,);plol(x,y,o;(・YY.lf.'b'」S'g:');grid;运行程序得到如下图:从结果屮很明显可以看出在[0.64].上.三次样条插值更精确,儿乎与原函数帀合。

数值分析计算实习题答案

数值分析计算实习题答案

数值分析计算实习题答案数值分析计算实习题答案数值分析是一门研究如何利用计算机对数学问题进行近似求解的学科。

在数值分析的学习过程中,实习题是一种重要的学习方式,通过实践来巩固理论知识,并培养解决实际问题的能力。

本文将为大家提供一些数值分析计算实习题的答案,希望能够帮助大家更好地理解和掌握数值分析的相关知识。

一、插值与拟合1. 已知一组数据点,要求通过这些数据点构造一个一次插值多项式,并求出在某一特定点的函数值。

答案:首先,我们可以根据给定的数据点构造一个一次插值多项式。

假设给定的数据点为(x0, y0), (x1, y1),我们可以构造一个一次多项式p(x) = a0 + a1x,其中a0和a1为待定系数。

根据插值条件,我们有p(x0) = y0,p(x1) = y1。

将这两个条件代入多项式中,可以得到一个方程组,通过求解这个方程组,我们就可以确定a0和a1的值。

最后,将求得的多项式代入到某一特定点,就可以得到该点的函数值。

2. 已知一组数据点,要求通过这些数据点进行最小二乘拟合,并求出拟合曲线的表达式。

答案:最小二乘拟合是一种通过最小化误差平方和来找到最佳拟合曲线的方法。

假设给定的数据点为(x0, y0), (x1, y1),我们可以构造一个拟合曲线的表达式y =a0 + a1x + a2x^2 + ... + anx^n,其中a0, a1, ..., an为待定系数。

根据最小二乘拟合原理,我们需要最小化误差平方和E = Σ(yi - f(xi))^2,其中yi为实际数据点的y值,f(xi)为拟合曲线在xi处的函数值。

通过求解这个最小化问题,我们就可以确定拟合曲线的表达式。

二、数值积分1. 已知一个函数的表达式,要求通过数值积分的方法计算函数在某一区间上的定积分值。

答案:数值积分是一种通过将定积分转化为数值求和来近似计算的方法。

假设给定的函数表达式为f(x),我们可以将定积分∫[a, b]f(x)dx近似为Σwi * f(xi),其中wi为权重系数,xi为待定节点。

数值分析计算实习第一题

数值分析计算实习第一题

直接用定义: ������������(������������)2 = ‖������������‖2‖������������−1‖2
求 A 的条件数很繁琐,需要先进行化简:
首先:
由于 A 是对称矩阵,
‖������������‖2 = �������������max(������������������������������������)
说明 :
1. 在所用的算法中,凡是要给出精度水平的ε,都取 ������������=10−12。
2. 选择算法的时候应使矩阵 A 的所有零元素都不存储。
3. 打印以下内容:
(1)算法设计方案和思路。
(2)全部源程序。
(3)特征值������������1,������������501,������������������������,������������������������������������(������������=1,2,⋯,39)以及������������������������������������������������(������������)2, det������������的值(采用 e 型输出实型数,并 至少显示 12 位有效数字)。
λi[16] -2.533970311130E+00 λi[38] 8.648666065193E+00
λi[17] -2.003230769563E+00 λi[39] 9.254200344575E+00
λi[18] -1.503557611227E+00 cond(A)2 1.925204273903E+03
λi[19] -9.935586060080E-01 det(A) 2.772786141752E+118

数值分析(第五版)计算实习题第四章作业

数值分析(第五版)计算实习题第四章作业

第四章:1、(1):复合梯形建立m文件:function t=natrapz(fname,a,b,n)h=(b-a)/n;fa=feval(fname,a);fb=feval(fname,b); f=feval(fname,a+h:h:b-h+0.001*h); t=h*(0.5*(fa+fb)+sum(f));输入:>> syms x>> f=inline('sqrt(x).*log(x);'); >> natrapz(f,eps,1,10)输出:ans =-0.417062831779470输入:>> syms x>> f=inline('sqrt(x).*log(x);'); >> natrapz(f,eps,1,100)输出:ans =-0.443117908008157输入:>> syms x>> f=inline('sqrt(x).*log(x);'); >> natrapz(f,eps,1,1000)输出:ans =-0.444387538997162复合辛普森建立m文件:function t=comsimpson(fname,a,b,n)h=(b-a)/n;fa=feval(fname,a);fb=feval(fname,b);f1=feval(fname,a+h:h:b-h+0.001*h);f2=feval(fname,a+h/2:h:b-h+0.001*h);t=h/6*(fa+fb+2*sum(f1)+4*sum(f2));输入:>> syms x>> f=inline('sqrt(x).*log(x);');>> format long;>>comsimpson(f,eps,1,10)输出:ans =-0.435297890074689输入:>>syms x>>f=inline('sqrt(x).*log(x);');>>comsimpson(f,eps,1,100)输出:ans =-0.444161178415673输入:>>syms x>>f=inline('sqrt(x).*log(x);');>>comsimpson(f,eps,1,1000)输出:ans =-0.444434117614180(2)龙贝格建立m文件:function [RT,R,wugu,h]=Romberg(fun,a,b,wucha,m) %RT是龙贝格积分表%R是数值积分值%wugu是误差估计%h是最小步长%fun是被积函数%a b是积分下、上限%m是龙贝格积分表中行最大数目%wucha是两次相邻迭代值的绝对误差限n=1;h=b-a;wugu=1;x=a;k=0;RT=zeros(4,4);RT(1,1)=h*(feval(fun,a)+feval(fun,b))/2;while((wugu>wucha)&(k<m)|(k<4))k=k+1;h=h/2;s=0;for j=1:nx=a+h*(2*j-1);s=s+feval(fun,x);endRT(k+1,1)=RT(k,1)/2+h*s;n=2*n;for i=1:kRT(k+1,i+1)=((4^i)*RT(k+1,i)-RT(k,i))/(4^i-1);endwugu=abs(RT(k+1,k)-RT(k+1,k+1));endR=RT(k+1,k+1);输入:>>fun=inline('sqrt(x).*log(x)');>> [RT,R,wugu,h]=Romberg(fun,eps,1,1e-5,13)输出:RT =1 至5 列-0.000000268546145 0 0 0-0.245064670140209 -0.326752804004897 0 0-0.358104125949240 -0.395783944552250 -0.400386020588741 0 0-0.408090073087781 -0.424752055467295 -0.426683262861631 -0.427100679405645 0-0.429474601629505 -0.436602777810080 -0.437392825966266 -0.437562819031419 -0.437603847029951-0.438389494461832 -0.441361125405941 -0.441678348578999 -0.441746372747455 -0.4417627788404596 列-0.441766844267449R =-0.441766844267449wugu =4.065426989774412e-06h =0.031250000000000(3)自适应辛普森输入:>> f=inline('sqrt(x).*log(x)');>> q=quad(f,0,1,1e-4)输出:q =-0.4439755729517282.(1)复合辛普森建立m文件function q=combinesimpson2(F,x0,a,b,n)%复合Simpson多元求积公式%F—被积函数%x0—被积函数自变量%[a,b]积分区间%n—区间份数x=linspace(a,b,n+1);q=0;for k=1:nq=q+subs(F,x0,x(k))+4*subs(F,x0,(x(k)+x(k+1))/2)+subs(F,x0,x(k+1)); endq=q*(b-a)/n/6;输入:>> clear>> syms x y;>> F=exp(-x.*y);>> s=combinesimpson2(combinesimpson2(F,'x',0,1,4),'y',0,1,4)输出:s =exp(-1)/576 + exp(-1/2)/144 + exp(-1/4)/72 + exp(-3/4)/144 + exp(-1/8)/36 +exp(-3/8)/36 + exp(-5/8)/72 + exp(-7/8)/72 + (5*exp(-1/16))/144 + exp(-3/16)/24 + exp(-5/16)/36 + exp(-7/16)/36 + exp(-9/16)/144 + exp(-1/32)/36 + exp(-3/32)/18 + exp(-5/32)/36 + exp(-7/32)/36 + exp(-9/32)/36 + exp(-15/32)/36 + exp(-21/32)/36 + exp(-1/64)/36 + exp(-3/64)/18 + exp(-5/64)/18 + exp(-7/64)/18 + exp(-9/64)/36 + exp(-15/64)/18 + exp(-21/64)/18 + exp(-25/64)/36 + exp(-35/64)/18 + exp(-49/64)/36 + 47/576>> double(s)ans =0.796599967946203高斯求积公式function q=gaussquad(F,x0,a,b,n)%Gauss求积公式%F—被积函数%x0—被积函数自变量%[a,b]积分区间%n—节点个数syms t;F=subs(F,x0,(b-a)/2*t+(a+b)/2);[x,A]=gausspoints(n);q=(b-a)/2*sum(A.*subs(F,t,x));输入:>> clear>> syms x y;F=exp(-x.*y);>> s=gaussquad(gaussquad(F,x,0,1,4),y,0,1,4)输出:s =0.7966(2)复合辛普森输入:>> syms x y;>> f=exp(-x.*y);>> s=combinesimpson2(combinesimpson2(f,y,0,sqrt(1-x^2),4),x,0,1,4)输出:s =(3^(1/2)*(exp(-3^(1/2)/4) + 2*exp(-3^(1/2)/8) + 2*exp(-3^(1/2)/16) + 2*exp(-(3*3^(1/2))/16) + 4*exp(-3^(1/2)/32) + 4*exp(-(3*3^(1/2))/32) + 4*exp(-(5*3^(1/2))/32) + 4*exp(-(7*3^(1/2))/32) + 1))/576 + (7^(1/2)*(exp(-(3*7^(1/2))/16) + 2*exp(-(3*7^(1/2))/32) + 2*exp(-(3*7^(1/2))/64) + 2*exp(-(9*7^(1/2))/64) + 4*exp(-(3*7^(1/2))/128) + 4*exp(-(9*7^(1/2))/128) + 4*exp(-(15*7^(1/2))/128) + 4*exp(-(21*7^(1/2))/128) + 1))/1152 + (15^(1/2)*(exp(-15^(1/2)/16) + 2*exp(-15^(1/2)/32) + 2*exp(-15^(1/2)/64) + 2*exp(-(3*15^(1/2))/64) + 4*exp(-15^(1/2)/128) + 4*exp(-(3*15^(1/2))/128) + 4*exp(-(5*15^(1/2))/128) + 4*exp(-(7*15^(1/2))/128) + 1))/1152 + (15^(1/2)*(exp(-(7*15^(1/2))/64) + 2*exp(-(7*15^(1/2))/128) + 2*exp(-(7*15^(1/2))/256) + 2*exp(-(21*15^(1/2))/256) + 4*exp(-(7*15^(1/2))/512) + 4*exp(-(21*15^(1/2))/512) + 4*exp(-(35*15^(1/2))/512) + 4*exp(-(49*15^(1/2))/512) + 1))/1152 + (39^(1/2)*(exp(-(5*39^(1/2))/64) + 2*exp(-(5*39^(1/2))/128) + 2*exp(-(5*39^(1/2))/256) + 2*exp(-(15*39^(1/2))/256) + 4*exp(-(5*39^(1/2))/512) + 4*exp(-(15*39^(1/2))/512) + 4*exp(-(25*39^(1/2))/512) + 4*exp(-(35*39^(1/2))/512) + 1))/1152 + (55^(1/2)*(exp(-(3*55^(1/2))/64) + 2*exp(-(3*55^(1/2))/128) + 2*exp(-(3*55^(1/2))/256) + 2*exp(-(9*55^(1/2))/256) + 4*exp(-(3*55^(1/2))/512) + 4*exp(-(9*55^(1/2))/512) + 4*exp(-(15*55^(1/2))/512) + 4*exp(-(21*55^(1/2))/512) + 1))/1152 + (63^(1/2)*(exp(-63^(1/2)/64) + 2*exp(-63^(1/2)/128) + 2*exp(-63^(1/2)/256) + 2*exp(-(3*63^(1/2))/256) + 4*exp(-63^(1/2)/512) + 4*exp(-(3*63^(1/2))/512) + 4*exp(-(5*63^(1/2))/512) + 4*exp(-(7*63^(1/2))/512) + 1))/1152 + 1/24>> double(s)ans =0.670113633359095。

数值分析报告(第五版)计算实习的题目第三章

数值分析报告(第五版)计算实习的题目第三章

数值分析计算实习题第三章第二次作业:题一:x=-1:0.2:1;y=1./(1+25.*x.^2);f1=polyfit(x,y,3)f=poly2sym(f1)y1=polyval(f1,x)x2=linspace(-1,1,10)y2=interp1(x,y,x2)plot(x,y,'r*-',x,y1,'b-')hold onplot(x2,y2,'k')legend('数据点','3次拟合曲线','3次多项式插值')xlabel('X'),ylabel('Y')输出:f1 =0.0000 -0.5752 0.0000 0.4841f =(4591875547102675*x^3)/81129638414606681695789005144064 - (3305*x^2)/5746 + (1469057404776431*x)/20282409603651670423947251286016 + 4360609662300613/9007199254740992y1 =-0.0911 0.1160 0.2771 0.3921 0.4611 0.4841 0.4611 0.3921 0.2771 0.1160 -0.0911x2 =-1.0000 -0.7778 -0.5556 -0.3333 -0.1111 0.1111 0.3333 0.5556 0.7778 1.0000y2 =0.0385 0.0634 0.1222 0.3000 0.7222 0.7222 0.3000 0.1222 0.0634 0.0385题二:X=[0.0 0.1 0.2 0.3 0.5 0.8 1.0];Y=[1.0 0.41 0.50 0.61 0.91 2.02 2.46];p1=polyfit(X,Y,3)p2=polyfit(X,Y,4)Y1=polyval(p1,X)Y2=polyval(p2,X)plot(X,Y,'r*',X,Y1,'b-.',X,Y2,'g--')p3=polyfit(X,Y,2)Y3=polyval(p3,X)f1=poly2sym(p1)f2=poly2sym(p2)f3=poly2sym(p3)plot(X,Y,'r*',X,Y1,'b-.',X,Y2,'g--',X,Y3,'m--')legend('数据点','3次多项式拟合','4次多项式拟合','2次多项式拟合') xlabel('X轴'),ylabel('Y轴')输出:p1 =-6.6221 12.8147 -4.6591 0.9266p2 =2.8853 -12.3348 16.2747 -5.2987 0.9427Y1 =0.9266 0.5822 0.4544 0.5034 0.9730 2.0103 2.4602Y2 =0.9427 0.5635 0.4399 0.5082 1.0005 1.9860 2.4692p3 =3.1316 -1.2400 0.7356Y3 =0.7356 0.6429 0.6128 0.6454 0.8984 1.7477 2.6271f1 =- (7455778416425075*x^3)/1125899906842624 + (1803512222945435*x^2)/140737488355328 - (40981580032809*x)/8796093022208 + 8345953784399011/9007199254740992f2 =(1624271450198125*x^4)/562949953421312 - (3471944732519173*x^3)/281474976710656 + (4580931990070659*x^2)/281474976710656 - (1491459232922115*x)/281474976710656 + 1061409433081293/1125899906842624f3 =(18733*x^2)/5982 - (74179*x)/59820 + 73337/99700题三:建立三角插值函数的m文件function [A,B,Y1,Rm]=sanjiaobijin(X,Y,X1,m)%A B分别是m阶三角多项式Tm (x)的系数aj,bj(j=1,2,...,m)的系数矩阵,Y1是Tm(x)在X1处的值,X Y 数据点 ,Rm为均方误差n=length(X)-1;max1=fix((n-1)/2);if m>max1m=max1;endA=zeros(1,m+1);B=zeros(1,m+1);Ym=(Y(1)+Y(n+1))/2;Y(1)=Ym;Y(n+1)=Ym;A(1)=2*sum(Y)/n;for i=1:mB(i+1)=sin(i*X)*Y';A(i+1)=cos(i*X)*Y';endA=2*A/n;B=2*B/n;A(1)=A(1)/2;Y1=A(1);for k=1:mY1=Y1+A(k+1)*cos(k*X1)+B(k+1)*sin(k*X1);Tm=A(1)+A(k+1).*cos(k*X)+B(k+1).*sin(k*X);k=k+1;endY,Tm,Rm=(sum(Y-Tm).^2)/n输出:>> X=-pi:2*pi/33:pi;>> Y=X.^2.*cos(X);[A,B,Y1,Rm]=sanjiaobijin(X,Y,X1,16)输出:A =1 至 12 列-0.1397 4.4002 -2.8326 1.2355 -0.9128 0.7914 -0.7319 0.6982 -0.6773 0.6635 -0.6541 0.647413 至 17 列-0.6426 0.6393 -0.6370 0.6355 -0.6348B =1.0e-15 *1 至 12 列0 -0.0194 -0.0150 -0.0044 -0.0300 0.0105 0.0627 -0.0821 -0.0599 -0.0133 -0.0211 0.029713 至 17 列0.0178 0.0962 -0.1049 0.0328 -0.0122即可得16插值多项式的值X1=-pi:0.001:pi;[A,B,Y1,Rm]=sanjiaobijin(X,Y,X1,16)plot(X,Y,'r*',X1,Y1,'b-.')legend('数据点','16次三角插值多项式')xlabel('X轴'),ylabel('Y轴')。

数值分析计算实习一

数值分析计算实习一

数值分析大作业第一题学号:姓名:学院:授课教师:2016.10.24一、算法设计方案1、求λ1,λ501和λsa)利用幂法计算出矩阵A 按模最大的特征值,设其为λm 。

b)令矩阵B =A −λm I (I 为单位矩阵),同样利用幂法计算出矩阵B 按模最大的特征值λm ′。

c)令λm ′′=λm ′+λm 。

由计算过程可知λm 和λm ′′分别为矩阵A 所有特征值按大小排序后,其中两端的值。

即,λ1=min⁡{λm ,λm ′′},λ501=max⁡{λm ,λm ′′}。

d) 利用反幂法计算λs 。

其中通过使用doolittle 三角分解法求解线性方程组AX =I 的形式求得矩阵A 的逆A −1。

进行doolittle 分解,可以节省内存空间而把矩阵A 压缩,将A 中带上的元素存储为数组C [5][501]。

2、求A 的与数μk =λ1+k λ501−λ140最接近的特征值λi k (k =1,2, (39)e) 令矩阵D k =A −μk I ,利用反幂法计算出矩阵D k 按模最小的特征值λi k ′,则λi k =λi k ′+μk 。

其中,同样使用doolittle 三角分解法求解线性方程组D k X =I 的形式求得矩阵D k 的逆D k −1,其中k =1,2, (39)3)求矩阵A 的条件数cond(A )2和行列式det(A )f) 计算矩阵的条件数cond(A)2=|λm λs |。

g)计算矩阵的行列式det(A )为A 三角分解后得到的上三角矩阵U 的对角线元素之积。

二、程序#include<iostream>#include<cmath>#include <iomanip>using namespace std;double LU(double C[6][502]);//LU 分解double solve(double CC[6][502],double array[502],double U[502]);//解线性方程组double mefa(double arr[][502]);//幂法double fanmefa(double array[][502]);//反幂法int max1(int a,int b,int c);int max2(int a ,int b);int min1(int a,int b);int main(){double a[502],d[6][502],d1[6][502],lam1,lam501,temp,lams,lamki,uk[40],condA,detA=1; //d 为压缩矩阵,d1为进行原点平移时求lam1和lam501的压缩矩阵int i,j,k;for(i=1;i<=501;i++){a[i]=(1.64-0.024*i)*sin(0.2*i)-0.64*exp(0.1/i);//求解主对角线上的元素}for (i=1;i<=5;i++)for (j=1;j<=501;j++){if(i==1){if ((j==1)||(j==2))d[i][j]=0;else d[i][j]=-0.064;}else if (i==2){if (j==1)d[i][j]=0;else d[i][j]=0.16;}else if (i==3)d[i][j]=a[j];else if(i==4){if (j==501)d[i][j]=0;else d[i][j]=0.16;}else if(i==5){if ((j==500)||(j==501))d[i][j]=0;else d[i][j]=-0.064;}}//The purpose of this part is to assign values to matrix d[][],and d[][] is a condensed matrix for A.lam1=mefa(d);for (i=1;i<=5;i++)for (j=1;j<=501;j++){if(i==3)d1[3][j]=d[3][j]-lam1;else d1[i][j]=d[i][j];}//设置d1的值,进行原点平移lam501=mefa(d1);lam501=lam501+lam1;if(lam1>lam501){temp=lam1;lam1=lam501;lam501=temp;}//将lam1和lam501中小的值赋给lam1for(i=1;i<=39;i++)uk[i]=lam1+i*(lam501-lam1)/40;//求解uk的值cout<<"近似特征值的结果为:"<<endl;for(i=1;i<=39;i++){for(k=1;k<=5;k++){for(j=1;j<=501;j++){if(k==3)d1[k][j]=d[k][j]-uk[i];else d1[k][j]=d[k][j];}}//求解uk时的原点平移LU(d1);lamki=fanmefa(d1);cout<<"λk"<<i<<'=';cout<<setiosflags(ios::scientific)<<setprecision(12)<<lamki+uk[i];if(i%2==0)cout<<endl;else cout<<" ";}cout<<endl;LU(d); //进行LU分解lams=fanmefa(d); //进行反幂法condA=fabs(lam1/lams);//求矩阵的条件数for(i=1;i<=501;i++)detA=detA*d[3][i];//求行列式的值cout<<"矩阵的最小特征值为:λ1="<<setiosflags(ios::scientific)<<setprecision(12)<<lam1<<endl;cout<<"矩阵的最大特征值为:λ501="<<setiosflags(ios::scientific)<<setprecision(12)<<lam501<<endl;cout<<"按模最小的特征值为:λs="<<setiosflags(ios::scientific)<<setprecision(12)<<lams<<endl;cout<<"矩阵的条件数为:cond(A)="<<setiosflags(ios::scientific)<<setprecision(12)<<condA<<endl;cout<<"行列式的值为:det(A)="<<setiosflags(ios::scientific)<<setprecision(12)<<detA<<endl;return(0);}double mefa(double arr[][502])//幂法求解按模最大的特征值{double u[502],y[502],eita,beta=0,firstbeta=0,sum,sum1;int i,j,k;for(i=1;i<=501;i++)u[i]=1;for (k=1;k<10000;k++){sum=0;for(j=1;j<=501;j++)sum=sum+u[j]*u[j];eita=sqrt(sum);for(j=1;j<=501;j++)y[j]=u[j]/eita;for(j=1;j<=501;j++){if(j==1)u[j]=arr[3][1]*y[1]+arr[2][2]*y[2]+arr[1][3]*y[3];if(j==2)u[j]=arr[4][1]*y[1]+arr[3][2]*y[2]+arr[2][3]*y[3]+arr[1][4]*y[4];if((j>=3)&&(j<=499))u[j]=arr[5][j-1]*y[j-2]+arr[4][j-1]*y[j-1]+arr[3][j]*y[j]+arr[2][j+1]*y[j+1]+arr[1][j+2]*y[j+2];if(j==500)u[j]=arr[5][498]*y[498]+arr[4][499]*y[499]+arr[3][500]*y[500]+arr[2][501] *y[501];if(j==501)u[j]=arr[5][499]*y[499]+arr[4][500]*y[500]+arr[3][501]*y[501];}//幂法中利用矩阵相乘求解uk的值firstbeta=beta;sum1=0;for(j=1;j<=501;j++)sum1=sum1+y[j]*u[j];beta=sum1;if(fabs((beta-firstbeta)/beta)<=1e-12) break;}return(beta);}double fanmefa(double array[][502])//利用反幂法求解矩阵按模最小的特征值{double u[502],y[502],eita,firstbeta=0,beta=0,sum,sum1;int i,j,k;for(i=1;i<=501;i++)u[i]=1;for (k=1;k<10000;k++){sum=0;for(j=1;j<=501;j++)sum=sum+u[j]*u[j];eita=sqrt(sum);for(j=1;j<=501;j++)y[j]=u[j]/eita;solve(array,y, u); //调用解线性方程组的程序解出ukfirstbeta=beta;sum1=0;for(j=1;j<=501;j++)sum1=sum1+y[j]*u[j];beta=sum1;if(fabs((firstbeta-beta)/firstbeta)<=1e-12) break;//}return(1/beta);}double LU(double C[6][502])//此函数对矩阵进行LU分解{double sum1,sum2;int i,j,k,t;for (k=1;k<=501;k++){for (j=k;j<=min1(k+2,501);j++){sum1=0;for (t=max1(1,k-2,j-2);t<=k-1;t++)sum1=sum1+C[k-t+3][t]*C[t-j+3][j];C[k-j+3][j]=C[k-j+3][j]-sum1;}for(i=k+1;i<=min1(k+2,501);i++){sum2=0;for(t=max1(1,i-2,k-2);t<=k-1;t++)sum2=sum2+C[i-t+3][t]*C[t-k+3][k];C[i-k+3][k]=(C[i-k+3][k]-sum2)/C[3][k];}}return(0);}double solve(double CC[6][502],double array[502],double U[502]) //此函数的功能是解线性方程组{double sum1,sum2,b[502];int i,t;//b[1]=array[1];for(i=1;i<=501;i++)b[i]=array[i];for(i=2;i<=501;i++){sum1=0;for(t=max2(1,i-2);t<=i-1;t++)sum1=sum1+CC[i-t+3][t]*b[t];b[i]=b[i]-sum1;}U[501]=b[501]/CC[3][501];for(i=500;i>=1;i--){sum2=0;for(t=i+1;t<=min1(i+2,501);t++)sum2=sum2+CC[i-t+3][t]*U[t];U[i]=(b[i]-sum2)/CC[3][i];}return(0);}int max1(int a,int b,int c){int t=a;if(b>t)t=b;if(c>t)t=c;return(t);}int max2(int a ,int b){int t=a;if(b>t)t=b;return(t);}int min1(int a,int b) {int t=a;if(b<t)t=b;return(t);}三、计算结果计算结果如下所示:1、矩阵的最小特征值为:λ1=-1.070011361502e+001矩阵的最大特征值为:λ501=9.724634098777e+000按模最小的特征值为:λs=-5.557910794230e-0032、近似特征值的结果为:λk1=-1.018293403315e+001 λk2=-9.585707425068e+000λk3=-9.172672423928e+000 λk4=-8.652284007898e+000λk5=-8.0934********e+000 λk6=-7.659405407692e+000λk7=-7.119684648691e+000 λk8=-6.611764339397e+000λk9=-6.0661********e+000 λk10=-5.585101052628e+000λk11=-5.114083529812e+000 λk12=-4.578872176865e+000λk13=-4.096470926260e+000 λk14=-3.554211215751e+000λk15=-3.0410********e+000 λk16=-2.533970311130e+000λk17=-2.003230769563e+000 λk18=-1.503557611227e+000λk19=-9.935586060075e-001 λk20=-4.870426738850e-001λk21=2.231736249575e-002 λk22=5.324174742069e-001λk23=1.052898962693e+000 λk24=1.589445881881e+000λk25=2.060330460274e+000 λk26=2.558075597073e+000λk27=3.080240509307e+000 λk28=3.613620867692e+000λk29=4.0913********e+000 λk30=4.603035378279e+000λk31=5.132924283898e+000 λk32=5.594906348083e+000λk33=6.080933857027e+000 λk34=6.680354092112e+000λk35=7.293877448127e+000 λk36=7.717111714236e+000λk37=8.225220014050e+000 λk38=8.648666065193e+000λk39=9.254200344575e+0003、矩阵的条件数为:cond(A)=1.925204273902e+003行列式的值为:det(A)=2.772786141752e+118四、讨论:初始向量的选取对计算结果的影响当选取初始向量为(1,1,1,1,...,1),1,2,3,...,501iu i==时,得到以上结果。

数值分析计算实习题

数值分析计算实习题

1.下列数据点的插值x 0 1 4 9 16 25 36 49 64y 0 1 2 3 4 5 6 7 8可以得到平方根函数的近似,在区间[0,64]上作图.(1)用这9个点作8次多项式插值Ls(x).(2)用三次样条(第一边界条件)程序求S(x).从得到结果看在[0,64]上,哪个插值更精确;在区间[0,1]上,两种插值哪个更精确?解:(1)拉格朗日插值多项式,求解程序如下syms x l;x1=[0 1 4 9 16 25 36 49 64];y1=[0 1 2 3 4 5 6 7 8];n=length(x1);Ls=sym(0);for i=1:nl=sym(y1(i));for k=1:i-1l=l*(x-x1(k))/(x1(i)-x1(k));endfor k=i+1:nl=l*(x-x1(k))/(x1(i)-x1(k));endLs=Ls+l;endLs=simplify(Ls) %为所求插值多项式Ls(x).输出结果为Ls =-/*x^2+95549/72072*x-1/00*x^8-2168879/0*x^4+19/0*x^7+657859/*x^3+33983/ 0*x^5-13003/00*x^6(2)三次样条插值,程序如下x1=[0 1 4 9 16 25 36 49 64];y1=[0 1 2 3 4 5 6 7 8];x2=[0:1:64];y3=spline(x1,y1,x2);p=polyfit(x2,y3,3); %得到三次样条拟合函数S=p(1)+p(2)*x+p(3)*x^2+p(4)*x^3 %得到S(x)输出结果为:S =/6464-2399/88*x+/1984*x^2+2656867/624*x^3(3)在区间[0,64]上,分别对这两种插值和标准函数作图,plot(x2,sqrt(x2),'b',x2,y2,'r',x2,y3,'y')蓝色曲线为y=函数曲线,红色曲线为拉格朗日插值函数曲线,黄色曲线为三次样条插值曲线可以看到蓝色曲线与黄色曲线几乎重合,因此在区间[0,64]上三次样条插值更精确。

数值分析计算实习题(二)

数值分析计算实习题(二)

数值分析计算实习题(二)数值分析计算实习题(二)SY1004114 全昌彪一:算法设计方案概述:本题采用fortran90语言编写程序,依据题目要求,采用带双步位移QR分解法求出所给矩阵的所有特征值,并求出相应于其实特征值的特征向量,以及相关需要给出的中间结果。

1、矩阵的A的初始化(赋值):利用子函数initial(a,n)来实现,返回n×n 维二维数组a。

2、A矩阵的拟上三角化:利用子函数hessenberg(a,n),在对矩阵进行QR分解前进行拟上三角化,这样可以提高计算效率,减少计算量,返回A矩阵的相似矩阵Hessenberg阵A(n-1)。

3、对A(n-1)进行带双步位移QR分解得出Cm及A矩阵的所有特征值,这一步利用了两个子函数eigenvalue(a,n,lamda,lamdai)和qrresolve(b,c,m)带双步位移QR分解可以加速收敛。

每次QR分解前先进行判断,若可以直接得到矩阵的特征值,则对矩阵直接降阶处理;若不可以,则进行QR分解,这样就进一步减少了计算量,提高了计算效率。

考虑到矩阵A可能有复特征值,采用两个一维数组lamda(n)及lamdai(n)分别存储其实部和虚部。

在双步位移处理及降阶过程中,被分解的矩阵Ak(m ×m)及中间矩阵M k(m×m)的维数随m不断减少而降阶,于是引入了动态矩阵C(m×m)和B(m×m)分别存储,在使用前,先声明分配内存,使用结束后立即释放内存。

返回A(n-1)经双步位移QR分解后的矩阵及A矩阵的所有特征值。

4、特征向量的求解:采用子函数eigenvector(a,lamda)实现求解A矩阵的属于实特征值的特征向量。

核心算法为高斯列主元消去法,(A-λI)x=b,b=0,回代过程令x(10)=1,即可求出对应于每一实特征值的特征向量的各个元素。

5、相关输出结果:所有数据均采用e型输出,数据保留到小数点后12位。

数值分析计算实习题列主元高斯消去法解线性方程组

数值分析计算实习题列主元高斯消去法解线性方程组

数值分析计算实习题第5章解线性方程组的直接方法列主元高斯消去法解线性方程组。

书上的计算实习题1、2、3都要求用列主元高斯消去法解线性方程组,所以考虑写一个普适的程序来实现。

对于线性方程组Ax=b,程序允许用户从文件读入矩阵数据或直接在屏幕输入数据。

文件输入格式要求:(1)第一行为一个整数n (2<=n<=100),表示矩阵阶数。

(2)第2〜n+1行为矩阵A各行列的值。

(3 )第n+2〜n+n+2行为矩阵b各行的值。

屏幕输入:按提示输入各个数据。

输出:A、b、det(A)、列主元高斯消去计算过程、解向量X。

【算法说明】设有线性方程组Ax=b,其中设A为非奇异矩阵。

方程组的增广矩阵为[a,b] =a n…第1步(k=l):首先在A的第一列中选取绝对值最大的元素%,作为第一步的主元素:如凜产如工0然后交换(A, b)的第1行与第1行元素,再进行消元计算。

设列主元素消去法已经完成第1步到第k・l步的按列选主元,交换两行,消元计算得到与原方程组等价的方程组A(k)x=b(k)用姐…哦盘…於?MB•■•■■[A,b]T[A(?b (*)] =■…盅•a"〉■唱”■■■••••...卅•第k步计算如下:对于k=l, 2, n-1 |時卜maxaf"(1)按列选主元:即确定t使(2)如果tHk,则交换[A, b]第t行与第k行元素。

(3)消元计算a ik J叫=-bgk + X・・Ji)a kk% <-%+叫ciy (i,j = k + l,…川)»〜乞+叫几 (j = k + l,…屮)消元乘数mik满足:M =吃 + 1,产•,)(4)回代求解(b厂工陶形)兀< ----- -- ---- ,('=〃_1屮_2,・・、1)【程序】/*【普适列主元消去法解线性方程组】对于线性方程组:Ax=b输入:[选择屏幕直接输入]1・A的行阶数11(1 <=n <= 100)2.A的值3.b的值[选择读取文件]文件名(和主程序同级文件夹下)输出:1.A2.b3.det(A)4.解向量x#include <stdio.h>#include <stdlib.h>#include <math.h>double A[1O5][1O5],A_B[1O5][1O 习、b[105],x[105]; double detA;int njnaik = 1;〃读入数据void input(){int ij;char ch[20],name[100];FILE *f;printfC^—-\ii是否从文件读取数据(Y/N):”); scaufp%s:&ch);if(ch[O] = Y' || ch[0] = V){prmtfC'请输入文件名(包扌舌扩展名):”);scanfi(H%s,\name);f= fbpen(name;,i n);fscaiif(f/%d*\&n);fbr(i = 0;i < n;i ++)for(j = 0j<nj ++)fbr(i = 0;i < n;i ++)住canfg'%lf;&b[i]);pnntfC请输入A的阶数:”);scanf(n%d %cT,&n);prmtfC请输入A的值:”);fbr(i = 0;i < n;i ++)for(j = Oj<nj ++) scaiif(M%lf\&A[i][j]);printf("请输入b的值:”);fbr(i = 0;i < n;i ++)}}〃计算行列式的值double det(double s[105][105],int m){int zj,k;double b[105][105],total = 0,r; /*b[N][N]ffl于存放,在矩阵s[N][N]中元素s[0]的余子式*/fbr(z = 0;z < m;z-H-){for(j = 0j<m-lj++)for(k = 0;k < m-l;k ++)if(k >= z)b[j][k] = s[j+l][k+l];elsebQ][k] = s[j+l][k];if(z % 2==0)r = s[0][z] * det(b4ii - 1); /*递归调用elser = (-1) * s[O]JXl * det(bjn - 1);total = total + r;}}else if(m = 2)total = s[0][0] * s[l][l] - s[0][l] * s[l][0];else if(m = 1)total = s[0][0];return total;}//输出A和b和det(A) void output_lQ{int ij;pnntffA = \ii n);for(i = 0;i < n;i ++){for。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

插值法1.下列数据点的插值x 0 1 4 9 16 25 36 49 64y 0 1 2 3 4 5 6 7 8可以得到平方根函数的近似,在区间[0,64]上作图.(1)用这9个点作8次多项式插值Ls(x).(2)用三次样条(第一边界条件)程序求S(x).从得到结果看在[0,64]上,哪个插值更精确;在区间[0,1]上,两种插值哪个更精确?解:(1)拉格朗日插值多项式,求解程序如下syms x l;x1=[0 1 4 9 16 25 36 49 64];y1=[0 1 2 3 4 5 6 7 8];n=length(x1);Ls=sym(0);for i=1:nl=sym(y1(i));for k=1:i-1l=l*(x-x1(k))/(x1(i)-x1(k));endfor k=i+1:nl=l*(x-x1(k))/(x1(i)-x1(k));endLs=Ls+l;endLs=simplify(Ls) %为所求插值多项式Ls(x).输出结果为Ls =-24221063/63504000*x^2+95549/72072*x-1/3048192000*x^8-2168879/435456000 *x^4+19/283046400*x^7+657859/10886400*x^3+33983/152409600*x^5-13003/2395008 000*x^6(2)三次样条插值,程序如下x1=[0 1 4 9 16 25 36 49 64]; y1=[0 1 2 3 4 5 6 7 8]; x2=[0:1:64];y3=spline(x1,y1,x2);p=polyfit(x2,y3,3); %得到三次样条拟合函数 S=p(1)+p(2)*x+p(3)*x^2+p(4)*x^3 %得到S(x) 输出结果为: S =23491/304472833/8*x+76713/*x^2+6867/42624*x^3(3)在区间[0,64]上,分别对这两种插值和标准函数作图,plot(x2,sqrt(x2),'b',x2,y2,'r',x2,y3,'y')蓝色曲线为y=√x 函数曲线,红色曲线为拉格朗日插值函数曲线,黄色曲线为三次样条插值曲线可以看到蓝色曲线与黄色曲线几乎重合,因此在区间[0,64]上三次样条插值更精确。

在[0,1]区间上由上图看不出差别,不妨代入几组数据进行比较 ,取x4=[0:0.2:1]010203040506070-2020406080100x4=[0:0.2:1];sqrt(x4) %准确值subs(Ls,'x',x4) %拉格朗日插值spline(x1,y1,x4) %三次样条插值运行结果为ans =0 0.4472 0.6325 0.7746 0.8944 1.0000ans =0 0.2504 0.4730 0.6706 0.8455 1.0000ans =0 0.2429 0.4630 0.6617 0.8403 1.0000从这几组数值上可以看出在[0,1]区间上,拉格朗日插值更精确。

数据拟合和最佳平方逼近2.有实验给出数据表x 0.0 0.1 0.2 0.3 0.5 0.8 1.0y 1.0 0.41 0.50 0.61 0.91 2.02 2.46试求3次、4次多项式的曲线拟合,再根据数据曲线形状,求一个另外函数的拟合曲线,用图示数据曲线及相应的三种拟合曲线。

解:(1)三次拟合,程序如下sym x;x0=[0.0 0.1 0.2 0.3 0.5 0.8 1.0];y0=[1.0 0.41 0.50 0.61 0.91 2.02 2.46];cc=polyfit(x0,y0,3);S3=cc(1)+cc(2)*x+cc(3)*x^2+cc(4)*x^3 %三次拟合多项式xx=x0(1):0.1:x0(length(x0));yy=polyval(cc,xx);plot(xx,yy,'--');hold on;plot(x0,y0,'x');xlabel('x');ylabel('y');运行结果S3 =-25083/42624+45437/5328*x-4945/5328*x^2+99509/70496*x^3图像如下(2)4次多项式拟合sym x;x0=[0.0 0.1 0.2 0.3 0.5 0.8 1.0];y0=[1.0 0.41 0.50 0.61 0.91 2.02 2.46]; cc=polyfit(x0,y0,4);S3=cc(1)+cc(2)*x+cc(3)*x^2+cc(4)*x^3+cc(5)*x^4 xx=x0(1):0.1:x0(length(x0)); yy=polyval(cc,xx); plot(xx,yy,'r'); hold on;plot(x0,y0,'x'); xlabel('x'); ylabel('y');运行结果S3 =96215//0656*x+70637/0656*x^2-88425/42624*x^3+50307/40992*x^4图像如下00.10.20.30.40.50.60.70.80.91xy(3)另一个拟合曲线, 新建一个M-file 程序如下:function [C,L]=lagran(x,y) w=length(x); n=w-1;L=zeros(w,w); for k=1:n+1 V=1;for j=1:n+1 if k~=jV=conv(V,poly(x(j)))/(x(k)-x(j)); end endL(k,:)=V; end C=y*L在命令窗口中输入以下的命令:x=[0.0 0.1 0.2 0.3 0.5 0.8 1.0];y=[1.0 0.41 0.50 0.61 0.91 2.02 2.46];00.10.20.30.40.50.60.70.80.91xycc=polyfit(x,y,4);xx=x(1):0.1:x(length(x)); yy=polyval(cc,xx); plot(xx,yy,'r'); hold on;plot(x,y,'x'); xlabel('x'); ylabel('y');x=[0.0 0.1 0.2 0.3 0.5 0.8 1.0];y=[0.94 0.58 0.47 0.52 1.00 2.00 2.46]; %y 中的值是根据上面两种拟合曲线而得到的估计数据,不是真实数据 [C,L]=lagran(x,y); xx=0:0.01:1.0; yy=polyval(C,xx); hold on;plot(xx,yy,'b',x,y,'.');图像如下解线性方程组的直接解法 3. 线性方程组Ax =b 的A 及b 为00.10.20.30.40.50.60.70.80.91xyA =[10 7 8 77 5 6 58 6 10 97 5 9 10],b =[32233331],则解x =[1111].用MATLAB 部函数求det A 及A 的所有特征值和cond(A )2.若令A +δA =[10 7 8.1 7.27.08 5.04 6 58 5.98 9.89 96.99 5 9 9.98],求解(A +δA )(x +δx )=b ,输出向量x 和||δx||2.从理论结果和实际计算两方面分析线性方程组Ax =b 解得相对误差||δx||2/||x||2及A 的相对误差||δA||2/||A||2的关系.解:(1)程序如下clear;A=[10 7 8 7;7 5 6 5;8 6 10 9;7 5 9 10]; det(A) cond(A,2) eig(A)输出结果为ans = 1 ans =2.9841e+003 ans =0.0102 0.8431 3.8581 30.2887(2)程序如下A=[10 7 8.1 7.2;7.08 5.04 6 5;8 5.98 9.89 9;6.99 5 9 9.98]; b=[32 23 33 31]'; x0=[1 1 1 1]';x=A\b %扰动后方程组的解 x1=x-x0 %δx 的值 norm(x1,2) %δx 的2-数运行结果为x =-9.586318.3741-3.22583.5240x1 =-10.586317.3741-4.22582.5240ans =20.9322程序如下A=[10 7 8.1 7.2;7.08 5.04 6 5;8 5.98 9.89 9;6.99 5 9 9.98];A0=[10 7 8 7;7 5 6 5;8 6 10 9;7 5 9 10];b=[32 23 33 31]';x0=[1 1 1 1]';x=A\b;x1=x-x0;norm(x1,2);A1=A-A0 ; %δA的值norm(x1,2)/norm(x0,2) % ||δx||2/||x||2的值norm(A1,2)/norm(A0,2) %||δA||2/||A||2的值输出结果为ans =10.4661ans =0.0076可见A相对误差只为0.0076,而得到的结果x的相对误差就达到了10.4661,该方程组是病态的,A的条件数为2984.1远远大于1,当A只有很小的误差就会给结果带来很大的影响。

非线性方程数值解法4.求下列方程的实根(1)x^2-3x+2-e^x=0;(2)x^3+2x^2+10x-20=0.要求:(1)设计一种不动点迭代法,要使迭代序列收敛,然后再用斯特芬森加速迭代,计算到|x(k)-x(k-1)|<10^(-8)为止。

(2)用牛顿迭代,同样计算到|x(k)-x(k-1)|<10^(-8)。

输出迭代初值及各次迭代值和迭代次数k ,比较方法的优劣。

解:(1)先用画图的方法估计根的围ezplot('x^2-3*x+2-exp(x)'); grid on;可以估计到方程的根在区间(0,1);选取迭代初值为x0=0.5; 构造不动点迭代公式x(k+1)=( x(k)^2+2-e^x(k))/3; ψ(x)= ( x^2+2-e^x)/3;当0<x<1时,0<ψ(x)<1; ψ’(x)<`1;因此迭代公式收敛。

程序如下:format long;f=inline('(x^2+2-exp(x))/3')-6-4-20246-200-150-100-5050xx 2-3 x+2-exp(x)disp('x=');x=feval(f,0.5);disp(x);Eps=1E-8;i=1;while 1x0=x;i=i+1;x=feval(f,x);disp(x);if abs(x-x0)<Epsbreak;endendi,x运行结果为f =Inline function:f(x) = (x^2+2-exp(x))/3x=0.9960.8370.4130.4940.5090.2190.4830.5250.7960.8330.0460.5640.7670.501i =14x =0.501斯特芬森加速法,程序如下:format long;f=inline('x-((x^2+2-exp(x))/3-x)^2/((((x^2+2-exp(x))/3)^2+2-exp((x^2+2-exp(x))/3))/3-2*(x^2+2-exp(x))/3+x)');disp('x=');x=feval(f,0.5);disp(x);Eps=1E-8;i=1;while 1x0=x;i=i+1;x=feval(f,x);disp(x);if abs(x-x0)<Epsbreak;endendi,x运行结果为x=0.5790.9810.9860.986i =4x =0.986牛顿迭代法,程序如下:format long;x=sym('x');f=sym('x^2-3*x+2-exp(x)');df=diff(f,x);FX=x-f/df;Fx=inline(FX);disp('x=');x1=0.5;disp(x1);Eps=1E-8;i=0;while 1x0=x1;i=i+1;x1=feval(Fx,x1);disp(x1);if abs(x1-x0)<Epsbreak;endendi,x1运行结果如下:x=0.0000.8290.4710.9680.986i =4x1 =0.986(2) 先用画图的方法估计根的围ezplot('x^3+2*x^2+10*x-20'); grid on;根大约在区间(1,2);选取初值x0=1.5;构造不动点迭代公式x(k+1)=(-2x(k)^2-10x(k)+20)^1/3; ψ(x)=(-2x^2-10x+20)^1/3; 程序如下:format long;f=inline('(-2*x^2-10*x+20)^1/3') disp('x='); x=feval(f,1.5); disp(x) Eps=1E-8; i=1; while 1 x0=x; i=i+1;x=feval(f,x); disp(x);if abs(x-x0)>1E10 break;-6-4-20246-200-100100200300400xx 3+2 x 2+10 x-20if abs(x-x0)<Epsbreak;endendi,x运行结果:f =Inline function:f(x) = (-2*x^2-10*x+20)^1/3x=0.6676.259-38.806-8.9431e+002-4.4071e+005-1.4763e+011i =6x =-1.4763e+011迭代6次后x的值大得令人吃惊,表明构造的式子并不收敛. 也无法构造出收敛的不动点公式牛顿迭代法,程序如下:format long;x=sym('x');f=sym('x^3+2*x^2+10*x-20');df=diff(f,x);FX=x-f/df;Fx=inline(FX);disp('x=');x1=0.5;disp(x1);i=0;while 1x0=x1;i=i+1;x1=feval(Fx,x1);disp(x1);if abs(x1-x0)<Epsbreak;endendi,x1运行结果:x=1.0001.6371.3961.4411.137i =4x1 =1.137比较三种方法,牛顿法的收敛性比较好,相比不动点迭代法要构造出收敛的公式比较难,牛顿法迭代次数也较少,收敛速度快,只是对初值的要求很高,几种方法各有利弊,具体采用哪种也需因题而异。

相关文档
最新文档