数值分析计算机作业

合集下载

数值分析作业及参考答案

数值分析作业及参考答案

数值分析第一次作业及参考答案1. 设212S gt =,假定g 是准确的,而对t 的测量有0.1±秒的误差,证明当t 增加时S 的绝对误差增加,而相对误差却减少。

解:2**22211()0.122()0.10.2()1122,(),().r r e S S S gt gt gt e S gt e S t gt gt t e S e S =-=-====∴↑↑↓2. 设2()[,]f x C a b ∈且()()0f a f b ==,求证2''1max ()()max ().8a x ba xb f x b a f x ≤≤≤≤≤-解:由112,0),(,0)()()0()00.a b L x l x l x =⨯+⨯=(两点线性插值 插值余项为"111()()()()()()[,]2R x f x L x f x a x b a b ξξ=-=--∈ [,].x a b ∴∀∈有12211()()"()()()max "()[()()]221()()1max "()[]()max "().228a x ba xb a x b f x R x f x a x b f x x a b x x a b x f x b a f x ξ≤≤≤≤≤≤==--≤---+-≤=-21max ()()max "()8a xb a x b f x b a f x ≤≤≤≤∴≤-3. 已测得函数()y f x =的三对数据:(0,1),(-1,5),(2,-1),(1)用Lagrange 插值求二次插值多项式。

(2)构造差商表。

(3)用Newton 插值求二次插值多项式。

解:(1)Lagrange 插值基函数为0(1)(2)1()(1)(2)(01)(02)2x x l x x x +-==-+-+-同理 1211()(2),()(1)36l x x x l x x x =-=+ 故2202151()()(1)(2)(2)(1)23631i i i p x y l x x x x x x x x x =-==-+-+-++=-+∑(2)令0120,1,2x x x ==-=,则一阶差商、二阶差商为0112155(1)[,]4,[,]20(1)12f x x f x x ---==-==-----0124(2)[,,]102f x x x ---==-22()1(4)(0)1*(0)(1)31P x x x x x x =+--+-+=-+4. 在44x -≤≤上给出()xf x e =的等距节点函数表,若用二次插值求x e 的近似值,要使截断误差不超过610-,问使用函数表的步长h 应取多少?解:()40000(),(),[4,4],,,, 1.x k x f x e f x e e x x h x x h x x th t ==≤∈--+=+≤考察点及(3)200044343()()[(()]()[()]3!(1)(1)(1)(1)3!3!.(4,4).6f R x x x h x x x x h t t t e t h th t h e h e ξξ=----+-+≤+⋅⋅-=≤∈-则436((1)(1)100.006.t t t h --+±<< 在点 得5. 求2()f x x =在[a,b ]上的分段线性插值函数()h I x ,并估计误差。

数值分析大作业

数值分析大作业

数值分析上机作业(一)一、算法的设计方案1、幂法求解λ1、λ501幂法主要用于计算矩阵的按模最大的特征值和相应的特征向量,即对于|λ1|≥|λ2|≥.....≥|λn|可以采用幂法直接求出λ1,但在本题中λ1≤λ2≤……≤λ501,我们无法判断按模最大的特征值。

但是由矩阵A的特征值条件可知|λ1|和|λ501|之间必然有一个是最大的,通过对矩阵A使用幂法迭代一定次数后得到满足精度ε=10−12的特征值λ0,然后在对矩阵A做如下的平移:B=A-λ0I由线性代数(A-PI)x=(λ-p)x可得矩阵B的特征值为:λ1-λ0、λ2-λ0…….λ501-λ0。

对B矩阵采用幂法求出B矩阵按模最大的特征值为λ∗=λ501-λ0,所以λ501=λ∗+λ0,比较λ0与λ501的大小,若λ0>λ501则λ1=λ501,λ501=λ0;若λ0<λ501,则令t=λ501,λ1=λ0,λ501=t。

求矩阵M按模最大的特征值λ的具体算法如下:任取非零向量u0∈R nηk−1=u T(k−1)∗u k−1y k−1=u k−1ηk−1u k=Ay k−1βk=y Tk−1u k(k=1,2,3……)当|βk−βk−1||βk|≤ε=10−12时,迭终终止,并且令λ1=βk2、反幂法计算λs和λik由已知条件可知λs是矩阵A 按模最小的特征值,可以应用反幂法直接求解出λs。

使用带偏移量的反幂法求解λik,其中偏移量为μk=λ1+kλ501−λ140(k=1,2,3…39),构造矩阵C=A-μk I,矩阵C的特征值为λik−μk,对矩阵C使用反幂法求得按模最小特征值λ0,则有λik=1λ0+μk。

求解矩阵M按模最小特征值的具体算法如下:任取非零向量u 0∈R n ηk−1= u T (k−1)∗u k−1y k−1=u k−1ηk−1 Au k =y k−1βk =y T k−1u k (k=1,2,3……)在反幂法中每一次迭代都要求解线性方程组Au k =y k−1,当K 足够大时,取λn =1βk 。

数值分析作业(完整版)

数值分析作业(完整版)

的逆阵 A ,用左除命令 A \ E 检验你的结果。
clc clear close all A=[1 1 1 1 1;1 2 3 4 5;1 3 6 10 15;1 4 10 20 35;1 5 15 35 70]; fprintf('对上述矩阵进行列主元素分解:\n') for i=1:1:r-1 [mx,ro]=max(abs(A(i:r,i))); % 寻找a阵第i列的最大值 [A(i,:),A(ro+i-1,:)]=exchange(A(i,:),A(ro+i-1,:)); % 进行行与行交换 for j=i+1:1:r A(j,:)=A(j,:)-A(j,i)/A(i,i)*A(i,:); end A End %--矩阵A的逆阵 A1=inv(A) %--左除验证 E=eye(5); A2=A\E % 5x5单位阵 % A阵的逆矩阵 % 输出每次交换后的A
第一章
1、计算积分 I n
Code: clc clear close all n=9; %--梯形积分法 x=0:0.01:1; y=(x.^n).*exp(x-1); In = trapz(x,y); In2=vpa(In,6) % 6位有效数字 %--高精度积分法 F = @(x1)(x1.^n).*exp(x1-1); s = quad(F,0,1); s1=vpa(s,6)
0
0, 0, 0, 0, 0 。
T
if abs(er(:,i-1))<=e fprintf('在迭代 %d 次之后,满足精度要求,x向量的值如下:\n',i); fprintf('x1=%.5f, x2=%.5f, x3=%.5f, x4=%.5f, x5=%.5f\n',x(1,i),x(2,i),x(3,i),x(4,i),x(5,i)); break end end %--绘图 figure(1) plot(1:1:i,x(1,:),'b',1:1:i,x(2,:),'k',1:1:i,x(3,:),'g',1:1:i,x(4,:), 'r',1:1:i,x(5,:),'c') legend('x1','x2','x3','x4','x5') grid on title('Jacobi迭代法——x值随迭代次数变化曲线') figure(2) plot(1:1:i-1,er(1,:),'b',1:1:i-1,er(2,:),'k',1:1:i-1,er(3,:),'g',1:1: i-1,er(4,:),'r',1:1:i-1,er(5,:),'c') legend('△x1','△x2','△x3','△x4','△x5') grid on title('Jacobi迭代法——△x值随迭代次数变化曲线') %% fprintf('\n-------------Gauss-Seidel迭代法---------------------\n'); U=-(A1-D); L=-(A2-D); DL_1=inv(D-L); M1=DL_1*U; b2=DL_1*b; x1(:,1)=M1*x0+b2; for j=2:1:100 x1(:,j)=M1*x1(:,j-1)+b2; er1(:,j-1)=x1(:,j)-x1(:,j-1); if abs(er1(:,j-1))<=e fprintf('在迭代 %d 次之后,满足精度要求,x向量的值如下:\n',j); fprintf('x1=%.5f, x2=%.5f, x3=%.5f, x4=%.5f, x5=%.5f\n',x1(1,j),x1(2,j),x1(3,j),x1(4,j),x1(5,j)); break end end %--绘图 figure(3) plot(1:1:j,x1(1,:),'b',1:1:j,x1(2,:),'k',1:1:j,x1(3,:),'g',1:1:j,x1(4 ,:),'r',1:1:j,x1(5,:),'c') legend('x1','x2','x3','x4','x5')

数值分析作业

数值分析作业

数值分析作业1..在字长为3的十进制计算机上计算f(3.33)和g(3.33),其中f(x)=x^4-x^3+3*x^2+x-2,g(x)=(((x-1)x+3)x+1)x-2.解: m=3;f=@(x)digit(digit(x^4,m)-digit(x^3,m)+digit(3*x^2,m)+digit(x-2,m),m);g=@(x)digit(digit(digit(digit(digit(digit((x-1)*x,m)+3,m)*x,m)+1,m)*x,m)-2,m); f(3.33) g(3.33) 有ans=121 ans=121 但当m=2;f=@(x)digit(digit(x^4,m)-digit(x^3,m)+digit(3*x^2,m)+digit(x-2,m),m);g=@(x)digit(digit(digit(digit(digit(digit((x-1)*x,m)+3,m)*x,m)+1,m)*x,m)-2,m); f(3.33) g(3.33) 有ans=120 ans=130说明两者在计算数学上相等,但是在数值上不一定相等。

2.下列各近似值的绝对误差限都是1/2*10^-3,试指出它们各有几位有效数字.x=1.00052, y=0.052, z=0.00052.解:(1)精确到小数点后第三位,故有4位有效数字;(2)精确到小数点后第三位,故有2位有效数字;(3)精确到小数点后第三位,故有0位有效数字。

12.学习使用Matlab 命令help 或doc,利用help 和doc 学习自己感兴趣的Matlab 的运算,函数或命令的用法,并对于任意给定的实数a,b,c,编写Matlab 程序求方程02^=++c bx ax 。

解:dis('a*x^2+b*x+c=0');a=input('a=');b=input('b=');c=input('c=');p=[a b c];ans=roots(p)14.分别利用nX x In n n n ∑∞=+-=+11)1()1(,11≤<-x 和...)12...53(2111253+++++=-++n x x x x x x In n ,11<<-x 。

数值分析大作业之2

数值分析大作业之2

数值分析大作业二一、算法设计方案(一)算法流程1.将要求解的矩阵进行Householder变换,进行拟上三角化,并输出拟上三角化的结果;2.将拟上三角化后的矩阵进行带双步位移的QR分解(最大迭代次数1000次),逐个求出特征值,输出QR法结束后得到的Q、R、RQ阵,输出求出的特征值(用实部和虚部表示)3.对于求出来的实特征值,使用带原点平移的反幂法求出对应的特征向量,输出这些特征向量。

(二)程序设计流程1. 定义精度和最大迭代次数;2. 使用容器vector进行编程(方便增减元素),使用传引用调用(提高执行效率);3. 将各个步骤用到的数学算法封装成函数,方便调用。

具体需要的函数如下:double VectMod(vector< double > &p):求向量的模vector< double > NumbMultiVect(vector< double > &vect, double a):数乘向量double VectMultiVect(vector< double > &y, vector< double > &u):求两个向量的积vector< double > ConveArraMultiVect(vector< vector< double > > &B, vector<double > &u):矩阵的转置乘向量vector< double > ArraMultiVect(vector< vector< double > > &B, vector< double > &u):矩阵乘向量vector< vector< double > > VectMultiCovVect(vector< double > &a, vector< double >&b):向量乘向量转置得到矩阵void ArraSubs(vector< vector< double > > &C, vector< vector < double > > D) :两个矩阵相减Vector< double > VectSubs(vector< double > &a, vector< double > &b):两个向量相减vector<vector<double>> GetM(vector<vector<double>> &A):求解矩阵M (用于双部位移QR迭代用)double GetMode(vector < vector < double > > &B, const int r):求解矩阵B的r列向量的模double GetModeH(vector < vector < double > > &B, const int r):求解矩阵B的第r列向量的模,用于拟对角化vector< vector< double > > NumbMultiArra(vector< vector< double > > &D, double a):一个实数乘矩阵bool IsBirZeroH(vector< vector< double > > &B, const int r):判断B[i][r]对角线下是否为零void GausElim(vector< vector< double > > a):列主元高斯消元法求齐次方程解向量void Stop(vector< vector< double > > &Ar):停止,结束程序void SolutS1S2(complex< double > &s1, complex< double > &s2, vector< vector<double > > &A):求解二阶子阵的特征值s1,s2;void Save2(complex< double > &s1, complex< double > &s2):保存两个特征值void Save1(complex< double > &s):保存一个特征值void JudgemBelow2(vector< vector< double > > &A, vector< vector< double > > Abk):对于m == 1 及m == 0 的处理void Hessenberg(vector< vector< double > > &A):矩阵拟上三角化void QRMethod(vector< vector< double > > A):矩阵QR分解void CalculatAk(vector< vector < double > > &Ak):带双步位移QR迭代法二、源程序#include "stdafx.h"#include <vector>#include <iostream>#include <math.h>#include <complex>#include <fstream>using namespace std;const double epsion = 1e-12;const int L = 1000;int m,n;int k = 1;vector< vector< double > > I;vector< complex< double > > Lambda;///////////////////////////以下为自定义的算法流程中用到的函数double VectMod(vector< double > &p) //求向量的模{double value = 0.0;vector< double >::size_type i,j;j = p.size();for (i=1; i<j; i++){value += p[i] * p[i];}value = sqrt(value);return value;}vector< double > NumbMultiVect(vector< double > &vect, double a) //数乘向量{int j = vect.size();vector< double > b(j, 0);for (int i=1; i<j; i++){b[i] = a * vect[i];}return b;}double VectMultiVect(vector< double > &y, vector< double > &u)//两个向量相乘{vector< double >::size_type a = y.size();double value = 0;for (vector< double >::size_type i=1; i<a; i++){value += y[i] * u[i];}return value;}vector< double > ConveArraMultiVect(vector< vector< double > > &B, vector< double > &u)//矩阵的转置乘向量{int a = B.size();int b = u.size();vector< double > vec(a, 0);if (a != b){cerr << "Array and Vector not match in size!";}else{for (int i=1; i<a; i++){for (int j=1; j<a; j++){vec[i] += B[j][i] * u[j];}}return vec;}}vector< double > ArraMultiVect(vector< vector< double > > &B,vector< double > &u) //矩阵乘向量{int a = B.size();int b = u.size();vector< double > vec(a, 0);if (a != b){cerr << "Array and Vector not match in size!";}else{for (int i=1; i<a; i++){for (int j=1; j<a; j++){vec[i] += B[i][j] * u[j];}}return vec;}}vector< vector<double> > GetM(vector< vector <double> > &A){int a = A.size();double s = A[a-2][a-2] + A[a-1][a-1];double t = A[a-2][a-2] * A[a-1][a-1] - A[a-1][a-2] * A[a-2][a-1];vector<vector<double>> D(a, vector< double >(a, 0));for (int i=1; i<a; i++){{double sum = 0;for (int k=1; k<a; k++){sum += A[i][k] * A[k][j];}D[i][j] = sum - s * A[i][j] + t *(i==j ? 1.0 : 0);}}return D;}double GetMode(vector < vector < double > > &B, const int r){double value = 0;int a = B.size();for (int k=r; k<a; k++){value += B[k][r] * B[k][r];}value = sqrt(value);return value;}double GetModeH(vector < vector < double > > &B, const int r){double value = 0;int a = B.size();for (int k=r+1; k<a; k++){value += B[k][r] * B[k][r];}value = sqrt(value);return value;}vector< vector< double > > NumbMultiArra(vector< vector< double > > &D, double a)//数乘//向量{int b = D.size();vector< vector< double > > U(b, vector< double >(b, 0));for (int i=1; i<b; i++){{U[i][j] = a *D[i][j];}}return U;}bool IsBirZero(vector< vector< double > > &B, const int r){bool b = true;int a = B.size();for (int i=r+1; i<a; i++){if(abs(B[i][r]) > epsion){b = false;}}return b;}bool IsBirZeroH(vector< vector< double > > &B, const int r){bool b = true;int a = B.size();for (int i=r+2; i<a; i++){if(abs(B[i][r]) > epsion){b = false;}}return b;}vector< vector< double > > VectMultiCovVect(vector< double > &a,vector< double > &b)//向量乘向量的转置得到矩阵{int s1 = a.size();int s2 = b.size();if (s1 != s2){cerr << "Vectors not match in size ! ";}else{vector< vector< double > > U(s1, vector< double >(s1, 0));for (int i=1; i<s1; i++){for (int j=1; j<s1; j++){U[i][j] = a[i] * b[j];}}return U;}}void ArraSubs(vector< vector< double > > &C,vector< vector < double > > D){int a = C.size();int b = D.size();int c = C[0].size();int d = D[0].size();if (a!=b || c!=d){cerr << "Vectors not match in size !";}else{for (int i=1; i<a; i++){for (int j=1; j<a; j++){C[i][j] -= D[i][j];}}}}vector< double > VectSubs(vector< double > &a,vector< double > &b){int s1 = a.size();int s2 = b.size();if(s1 != s2){cerr << "Vectors not match in size !";}else{vector< double > value(s1,0);for (int i=1;i<s1;i++){value[i] = a[i] - b[i];}return value;}}void GausElim(vector< vector< double > > a) //高斯消元{int sz = a.size();vector< int > fx, ufx,ufxp, record;vector< double > x(sz, 0);vector< vector< double > > ret;//*****消元过程********for (int k = 1; k < sz-1; k++){double max = a[k][k];int p=0;for (int i=k+1; i<sz; i++){if (abs(a[i][k]) > abs(max)){p =i;max = a[i][k];}}//选出主元行if (abs(max) >= epsion){if (p != 0){for (int j=k; j<sz; j++){double temp = a[k][j];a[k][j] = a[p][j];a[p][j] = temp;}//交换主元行}for (int i=k+1; i<sz; i++){double tt = a[i][k] / a[k][k];for (int j=k+1; j<sz; j++){a[i][j] = a[i][j] - tt * a[k][j];}}}// end of if (abs(max) >= epsion)}// end of for (int k = 1; k < sz; k++)for (int i=1; i<sz; i++){int p=0;for (int j=1; j<=i;j++){if(abs(a[j][i]) >= 10*epsion)//不为零{p=j;}}record.push_back(p);}for (int i=1; i<sz; i++){int p=0;for (int j=sz-2; j>=0; j--){if (record[j] == i){p=j + 1;}}if (p != 0){ufxp.push_back(p);ufx.push_back(i);}}for (int i=1; i<sz; i++){int p = 0;for (int j=0; j < ufxp.size(); j++){if (ufxp[j] == i){p = 1;}}if (p == 0){fx.push_back(i);}}//end of for (int i=1; i<sz; i++)int c = fx.size();//***************************************************** for (int i=0; i<c; i++){for (int j=0; j<c; j++){if (i == j){x[fx.at(j)] = 1.0 + epsion;}else{x[fx.at(j)] = 0;}}int b = ufxp.size();for (int s=b-1; s>=0; s--){double temp=0;for(int t=ufxp.at(s)+1; t<sz; t++){temp += x[t] * a[ufx.at(s)][t];}x[ufxp.at(s)] = (0 - temp) / a[ufx.at(s)][ufxp.at(s)];}ret.push_back(x);}//end of for (int i=0; i<c; i++)//******************************************************* int sz1 = ret.size();int sz2 = ret[0].size();ofstream result2("CharactVector .txt", ios::app);result2.precision(12);for (int i=0; i<sz1; i++){for (int j=1;j<sz2; j++){result2 << scientific << ret[i][j] << endl;}result2 << endl << endl;}result2 << "下一个特征值的特征向量!" << endl;}void Stop(vector< vector< double > > &Ar){int a = Lambda.size();for (int i=0; i<a; i++){if (abs(Lambda[i].imag())<=epsion){vector< vector< double > > An=Ar;ArraSubs(An,NumbMultiArra(I,Lambda[i].real()));GausElim(An);}}ofstream result("result.txt");result.precision(12);vector<complex< double > >::iterator i,j;j = Lambda.end();for (i = Lambda.begin(); i<j; i++){result << scientific <<(*i) << endl;}exit(0);}void SolutS1S2(complex< double > &s1, complex< double > &s2,vector< vector< double > > &A){double s = A[m-1][m-1] + A[m][m];double t = A[m-1][m-1] * A[m][m] - A[m][m-1] * A[m-1][m];double det = s *s - 4.0 * t;if (det > 0){s1.imag(0);s1.real ((s + sqrt(det)) / 2);s2.imag (0);s2.real((s - sqrt(det)) / 2);}else{s1.imag(sqrt(0 - det) / 2);s1.real(s / 2);s2.imag(0 - sqrt(0 - det) / 2);s2.real(s / 2);}}void Save2(complex< double > &s1, complex< double > &s2)//存储特征值s1,s2 {Lambda.push_back(s1);Lambda.push_back(s2);}void Save1(complex< double > &s){Lambda.push_back(s);}void JudgemBelow2(vector< vector< double > > &A,vector< vector< double > > Abk){if (m == 1){complex< double > lbd;lbd.imag(0);lbd.real(A[1][1]);Save1(lbd);Stop(Abk);}else if (m == 0){Stop(Abk);}}//拟上三角化void Hessenberg(vector< vector< double > > &A){int a = A.size();vector< double > u(a,0);vector< double > p(a,0);vector< double > q(a,0);vector< double > w(a,0);double d, c, h, t;for (int r=1; r<a-2; r++){if (!IsBirZeroH(A, r)){d = GetModeH(A,r);c = (A[r+1][r] > 0) ?(0-d) : d;h = c * c - c * A[r+1][r];for (int j=1; j<a; j++){if (j < r+1){u[j] = 0;}else if (j == r+1){u[j] = A[j][r] - c;}else{u[j] = A[j][r];}}// end of for (int j=1; j<=m; j++)p = NumbMultiVect(ConveArraMultiVect(A, u), 1 / h);q = NumbMultiVect(ArraMultiVect(A, u), 1 / h);t = VectMultiVect(p, u) / h;w = VectSubs(q, NumbMultiVect(u, t));ArraSubs(A, VectMultiCovVect(w, u));ArraSubs(A, VectMultiCovVect(u, p));}// end of if (!IsBirZero(B, r))}// end of for (int r=1; r<m; r++)ofstream result("NISHANGDANJIAO.txt");result.precision(12);for (int i=1; i<a; i++){for (int j=1; j<a; j++){result << scientific << A[i][j] << " ";}result << endl;}}void QRMethod(vector< vector< double > > A){int a = A.size();vector< vector< double > > Q(a,vector < double > (a,0));for (int i=1; i<a; i++){Q[i][i] = 1.0;}vector< vector< double > > RQ(A);//vector< double > u(a,0);vector< double > v(a,0);vector< double > p(a,0);vector< double > q(a,0);vector< double > w(a,0);vector< double > l(a,0);double d, c, h, t;for (int r=1; r<a-1; r++){if (!IsBirZero(A, r)){d = GetMode(A,r);c = (A[r][r] > 0) ?(0-d) : d;h = c * c - c * A[r][r];for (int j=1; j<a; j++){if (j < r){u[j] = 0;}else if (j == r){u[j] = A[j][j] - c;}else{u[j] = A[j][r];}}// end of for (int j=1; j<=m; j++)l = ArraMultiVect(Q, u);ArraSubs(Q, VectMultiCovVect(l,NumbMultiVect(u, 1/h)));v = NumbMultiVect(ConveArraMultiVect(A, u), 1 / h);ArraSubs(A, VectMultiCovVect(u, v));p = NumbMultiVect(ConveArraMultiVect(RQ, u), 1 / h);q = NumbMultiVect(ArraMultiVect(RQ, u), 1 / h);t = VectMultiVect(p, u) / h;w = VectSubs(q, NumbMultiVect(u, t));ArraSubs(RQ, VectMultiCovVect(w, u));ArraSubs(RQ, VectMultiCovVect(u, p));}// end of if (!IsBirZero(B, r))}// end of for (int r=1; r<m; r++)ofstream result("QR.txt");result.precision(12);for (int i=1; i<a; i++){for (int j=1; j<a; j++){result << scientific << Q[i][j] << " ";}result << endl;}result << endl << endl;for (int i=1; i<a; i++){for (int j=1; j<a; j++){result << scientific << A[i][j] << " ";}result << endl;}result << endl << endl;for (int i=1; i<a; i++){for (int j=1; j<a; j++){result << scientific << RQ[i][j] << " ";}result << endl;}}void CalculatAk(vector< vector < double > > &Ak){int a = Ak.size();vector< vector < double > > B(a,vector < double > (a,0));vector< double > u(a,0);vector< double > v(a,0);vector< double > p(a,0);vector< double > q(a,0);vector< double > w(a,0);double d, c, h, t;B = GetM(Ak);for (int r=1; r<a-1; r++){if (!IsBirZero(B, r)){d = GetMode(B,r);c = (B[r][r] > 0) ?(0-d) : d;h = c * c - c * B[r][r];for (int j=1; j<a; j++){if (j < r){u[j] = 0;}else if (j == r){u[j] = B[j][j] - c;}else{u[j] = B[j][r];}}// end of for (int j=1; j<=m; j++)v = NumbMultiVect(ConveArraMultiVect(B, u), 1 / h);ArraSubs(B, VectMultiCovVect(u, v));p = NumbMultiVect(ConveArraMultiVect(Ak, u), 1 / h);q = NumbMultiVect(ArraMultiVect(Ak, u), 1 / h);t = VectMultiVect(p, u) / h;w = VectSubs(q, NumbMultiVect(u, t));ArraSubs(Ak, VectMultiCovVect(w, u));ArraSubs(Ak, VectMultiCovVect(u, p));}// end of if (!IsBirZero(B, r))}// end of for (int r=1; r<m; r++)}int _tmain(int argc, _TCHAR* argv[]){vector< vector< double > > A(11, vector< double >(11,0));vector< vector< double > > Abk;I=A;for (int i=1; i<11; i++){vector< double > temp;for (int j=1; j<11; j++){if(i != j){A[i][j] = sin(0.5 * i + 0.2 * j);I[i][j] = 0;}else{A[i][j] = 1.5 * cos(i + 1.2 *j);I[i][j] = 1.0;}}}Abk = A;n = A.size() - 1;m = n;//初始化问题Hessenberg(A);QRMethod(A);while (1){if (abs(A[m][m-1]) <= epsion){complex< double > lbdm;lbdm.imag(0);lbdm.real(A[m][m]);Save1(lbdm);m -= 1;//对A进行降维处理!!!!A.pop_back();int a = A.size();for (int i=0; i<a; i++){A[i].pop_back();}JudgemBelow2(A, Abk);}else{complex< double > va1, va2;SolutS1S2(va1, va2, A);if (m == 2){Save2(va1,va2);Stop(Abk);}//end of if (m == 2)if ( abs(A[m-1][m-2]) <= epsion){Save2(va1,va2);m = m - 2;//矩阵降维A.pop_back();A.pop_back();int a = A.size();for (int i=0; i<a; i++){A[i].pop_back();A[i].pop_back();}JudgemBelow2(A, Abk);}else{if (k == L){cerr << "Stop without solution";exit(-1);}else{CalculatAk(A);k += 1;}}}// end of if (abs(A[m][m-1]) >= epsion)}}三、实验结果(1)A经过拟上三角化后得到的矩阵-8.827516758830e-001 -9.933136491826e-002 -1.103349285994e+000-7.600443585637e-001 1.549101079914e-001 -1.946591862872e+000-8.782436382928e-002 -9.255889387184e-001 6.032599440534e-0011.518860956469e-001-2.347878362416e+000 2.372370104937e+000 1.819290822208e+0003.237804101546e-001 2.205798440320e-001 2.102692662546e+0001.816138086098e-001 1.278839089990e+000 -6.380578124405e-001-4.154075603804e-0011.0556********e-016 1.728274599968e+000 -1.171467642785e+000-1.243839262699e+000 -6.399758341743e-001 -2.002833079037e+0002.924947206124e-001 -6.412830068395e-001 9.783997621285e-0022.557763574160e-001-5.393383812774e-017 -3.165873865181e-017 -1.291669534130e+000-1.111603513396e+000 1.171346824096e+000 -1.307356030021e+0001.803699177750e-001 -4.246385358369e-001 7.988955239304e-0021.608819928069e-0011.533464996622e-017 5.963321406181e-017 0.000000000000e+0001.560126298527e+000 8.125049397515e-001 4.421756832923e-001-3.588616128137e-002 4.691742313671e-001 -2.736595050092e-001 -7.359334657750e-0021.300562737229e-016 -3.097060010889e-017 0.000000000000e+0000.000000000000e+000 -7.707773755194e-001 -1.583051425742e+000-3.042843176799e-001 2.528712446035e-001 -6.709925401449e-0012.544619929082e-0011.610216724767e-016 -2.211571837369e-016 0.000000000000e+0000.000000000000e+000 6.483933100712e-017 -7.463453456938e-001-2.708365157019e-002 -9.486521893682e-001 1.195871081495e-0011.929265617952e-0021.368550186199e-016 7.151513190805e-017 0.000000000000e+0000.000000000000e+000 -2.522454384246e-017 1.072074718358e-016-7.701801374364e-001 -4.697623990618e-001 4.988259468008e-0011.137691603776e-001-2.780851300718e-017 -6.708630788363e-017 0.000000000000e+0000.000000000000e+000 -3.282796821065e-017 4.879774287475e-0171.854829286220e-016 7.013167092107e-001 1.582180688475e-0013.862594614233e-001-2.124604440055e-017 -1.707979758930e-016 0.000000000000e+0000.000000000000e+000 1.013496750890e-016 -4.153758325241e-0171.222621691887e-016 -5.551115123126e-017 4.843807602783e-0013.992777995177e-001(2)Q-3.519262579534e-001 4.427591982245e-001 -6.955982513607e-0016.486200753651e-002 3.709718861896e-001 1.855847143605e-001-1.628942319628e-002 -1.181053169648e-001 -5.255375383724e-002 -5.486582943568e-002-9.360277287361e-001 -1.664679186545e-001 2.615299548560e-001 -2.438671728934e-002 -1.394774360893e-001 -6.977585391241e-0026.124472142963e-003 4.440505443139e-002 1.975907909728e-0022.062836970533e-002-4.208697095111e-017 -8.810520554692e-001 -3.989762796959e-0013.720308728479e-002 2.127794064090e-001 1.064463557221e-001-9.343171079758e-003 -6.774200464527e-002 -3.014340698675e-002 -3.146955080444e-002-2.150178169911e-017 4.009681353156e-017 -5.371806806439e-001 -1.234945854205e-001 -7.063151608719e-001 -3.533456368496e-0013.101438948264e-002 2.248676491598e-001 1.000601783527e-0011.044622748702e-0016.113458775639e-018 -3.721194648197e-0177.068175586628e-0189.892235468621e-001 -1.239411731211e-001 -6.200358589825e-0025.442272839461e-003 3.945881637235e-002 1.755813350011e-0021.833059462907e-0025.184948268593e-017 -4.198303559531e-017 3.255071298412e-017-1.527665297025e-017 5.323610690264e-001 -6.733900344896e-0015.910581205868e-002 4.285425323867e-001 1.906901343193e-0011.990794495295e-0016.419444583601e-017 4.121668945107e-017 3.096964582901e-017-5.050360323651e-017 -7.078737686239e-017 -6.0597********e-001 -9.165783032818e-002 -6.645586508974e-001 -2.957110877580e-001 -3.0872********e-0015.455993559780e-017 -9.724896332186e-017 3.956603694870e-0171.913857001710e-018 -4.316583456405e-0172.797376665557e-0179.933396625117e-001 -9.690440311939e-002 -4.311990584470e-002-4.501694411183e-002-1.108640877071e-017 4.655237056115e-017 -1.0722********e-017 -9.470236121745e-018 4.277993227986e-017 8.866601870176e-017 -2.516725033065e-016 5.410088006061e-001 -5.817540838226e-001 -6.0734********e-001-8.470152033092e-018 9.650816729410e-017 -1.429362211392e-017 -2.789222052040e-017 -3.690793770141e-017 -8.090765462521e-017 -1.964050295697e-016 -6.772274683437e-017 -7.221591336735e-0016.917269588876e-001(3)R2.508342744917e+000 -2.185646885493e+000 -1.314609070786e+000-3.558787493836e-002 -2.609857850388e-001 -1.283121847090e+000 -1.390878610606e-001 -8.712897972161e-001 3.849367902971e-0013.353802899665e-0012.100627753398e-016 -1.961603277854e+000 2.407523727633e-0017.054714572823e-001 5.957204318279e-001 5.526978774676e-001-3.268209924413e-001 -5.769498668364e-002 2.871129330189e-001 -8.895128754189e-002-3.300197935770e-016 -1.872873410421e-016 2.404534601993e+0001.706758096328e+000 -4.239566704091e-001 3.405332305815e+000-1.050017655852e-001 1.462257102734e+000 -6.684487469283e-001 -4.027*********e-0013.0773********e-017 1.746386351950e-017 0.000000000000e+0001.577122080722e+000 6.399535133956e-001 3.468127872427e-001-5.701786649768e-002 4.014788054433e-001 -2.222476176311e-001 -6.317059236442e-0021.760039865880e-016 9.988285339980e-017 0.000000000000e+0000.000000000000e+000 -1.447846997770e+000 -1.415724007744e+000-2.806139044665e-001 -2.817910521892e-001 -4.611434881851e-0021.996629079956e-0018.804885435596e-017 4.996802050991e-017 0.000000000000e+0000.000000000000e+000 8.831633340975e-017 1.231641451542e+0001.619701003419e-001 1.962638275504e-001 5.350035621760e-001-1.509273424767e-001-7.728357669400e-018 -4.385868928757e-018 0.000000000000e+0000.000000000000e+000 -7.751835246841e-018 -1.279231078565e-017-7.753441914209e-001 -3.464514508821e-001 4.312226803504e-0011.234643696237e-001-5.603391361152e-017 -3.179943413314e-017 0.000000000000e+0000.000000000000e+000 -5.620413613517e-017 -9.274974944455e-0170.000000000000e+000 1.296312940612e+000 -4.288053318338e-0012.737334158165e-001-2.493361499851e-017 -1.414991023727e-017 0.000000000000e+0000.000000000000e+000 -2.500935953597e-017 -4.127119443934e-0170.000000000000e+000 0.000000000000e+000 -6.707396440648e-001-4.842320121884e-001-2.603055667460e-017 -1.477242832192e-017 0.000000000000e+0000.000000000000e+000 -2.610963355436e-017 -4.308689959101e-0170.000000000000e+000 0.000000000000e+000 -1.110223024625e-0167.168323926323e-002(4)RQ1.163074414164e+0002.632670934508e+000 -1.772796003272e+000-8.668899138521e-002 3.300503471047e-001 1.455162371214e+000 -9.730650448593e-001 -4.873031174655e-001 -7.756411630489e-001 -3.249201979113e-0011.836115060851e+000 1.144286420080e-001 -9.880381403133e-0015.589725694767e-001 4.694190067101e-002 -2.978478237007e-0011.617130577649e-002 6.936977702522e-001 1.367670571405e-0011.419099231519e-0025.598200524418e-016 -2.118520153533e+000 -1.876189745783e+000-5.407071940597e-001 1.171538359721e+000 -2.550323020223e+0001.691577936540e+000 1.229951613262e+000 1.387947777212e+0008.667502917242e-001-3.179059303049e-017 -5.261714527977e-017 -8.471995127808e-0014.382910468318e-001 -1.008632199185e+000 -7.959374261495e-0014.769258865577e-001 4.072683083890e-001 4.096390493527e-0013.363378940862e-001-3.514195999269e-016 3.391949386044e-017 -2.160938214545e-016 -1.432244342447e+000 -5.742284908055e-001 1.213151477723e+000 -3.457508625575e-001 -4.749853573124e-001 -3.176158274191e-001 -4.294507015032e-002-3.704735750656e-017 -1.0998********e-016 -1.953241363386e-0178.269089741494e-017 6.556779598004e-001 -9.275250974463e-0012.529079844053e-001 6.905949216976e-001 -2.374430675823e-002-2.429781119781e-001-6.420051822287e-017 3.865817713597e-017 -3.806718328740e-0172.129734126613e-017 7.853*********e-017 4.698400884876e-001-2.730776009527e-001 7.821296259798e-001 -9.580964936399e-0027.846239841323e-0021.478496020372e-016 -8.383952267131e-017 9.577540382744e-017-7.120338911078e-017 -1.220876056602e-016 -1.854471832043e-0161.287679058937e+000 -3.576058900348e-001 -4.116725408807e-0033.914268216423e-0014.477158378610e-017 -6.204017427568e-017 3.360322998507e-017-1.133882337819e-017 -2.759056827456e-017 -9.217582575819e-0172.214639994444e-016 -3.628760503545e-001 7.398980975354e-0017.241608309576e-0023.408891482791e-017 2.353495494255e-017 1.932283926688e-017-3.456910153081e-017 -2.015177337156e-017 -8.084422691634e-017 -5.839476980893e-017 5.551115123126e-017 -5.176670596524e-0024.958522909877e-002(5)特征值(6.360627875745e-001,0.000000000000e+000)(5.650488993501e-002,0.000000000000e+000)(9.355889078188e-001,0.000000000000e+000)(-9.805309562902e-001,1.139489127430e-001)(-9.805309562902e-001,-1.139489127430e-001)(1.577548557113e+000,0.000000000000e+000)(-1.484039822259e+000,0.000000000000e+000)(-2.323496210212e+000,8.930405177200e-001)(-2.323496210212e+000,-8.930405177200e-001)(3.383039617436e+000,0.000000000000e+000)(6)实特征值的特征向量4.745031936539e+0003.157868541750e+0001.729946912420e+001-1.980049331455e+000-3.187521973524e+0017.794009603201e+000-1.004255685845e+0011.670757770480e+0011.310524273054e+0011.000000000001e+000下一个实特征值对应的特征向量:-5.105003830625e+000-4.886319842360e+0009.505161576151e+000-6.788331788214e-001-9.604334110499e+000-3.0457********e+0001.574873885602e+001-7.395037126277e+000-7.109654943661e+0001.000000000001e+000下一个实特征值对应的特征向量:2.792418944529e+0001.598236841512e+000-5.207507040911e-001-1.667886451702e+000-1.225708535859e+0017.241214790777e+000-5.398214501433e+0002.841008912974e+001-1.216518754416e+0011.000000000001e+000下一个实特征值对应的特征向量:6.217350824581e-001-1.115111815226e-001-2.483773580804e+000-1.306860840421e+000-3.815605442533e+0008.117305509395e+000-1.239170883675e+000-6.800309586197e-0012.691900144840e+0001.000000000001e+000下一个实特征值对应的特征向量:-1.730784582112e+0012.408192534967e+0014.133852365119e-001-8.572044074538e+0009.287334657928e-002-7.832726042776e-002-6.374274025716e-001-3.403204760832e-001。

数值分析上机作业

数值分析上机作业

第一章(1)按从大到小的顺序计算S的程序为:N#include<stdio.h>void main(){float n,j,s=0;printf("请输入n:");scanf("%f",&n);for(j=2;j<=n;j++)s=s+1/(j*j-1);printf("s=%f\n",s);}(2)按从小到大的顺序计算S的程序为:N#include<stdio.h>void main(){float n,j,s=0;printf("请输入n:");scanf("%f",&n);for(j=n;j>=2;j--)s=s+1/(j*j-1);printf("s=%f\n",s);}(3)精确值,从大到小,从小到大的计算程序为:#include<stdio.h>void main(){float n,j,s1,s2=0,s3=0;printf("请输入n:");scanf("%f",&n);s1=(3.0/2-1/n-1/(n+1))/2;for(j=2;j<=n;j++)s2=s2+1/(j*j-1);for(j=n;j>=2;j--)s3=s3+1/(j*j-1);printf("精确算法的结果为:%f\n",s1);printf("从大到小顺序的结果为:%f\n",s2); printf("从小到大顺序的结果为:%f\n",s3); }结果如下:精确值从大到小的值从小到大的值有效位数从大到小从小到大210S0.740049 0.740049 0.74005 6 5410S0.7499 0.749852 0.7499 4 4610S0.749999 0.749852 0.749999 3 6(4)通过本上机题,我们可以看出:当n较小时,两种算法的结果都很接近精确值,而当n较大时,两种算法的结果差别较大,按从大到小的顺序计算的值与精确值有较大的误差,而按从小到大的顺序计算的值与精确值吻合。

数值分析作业题(1)

数值分析作业题(1)

第一章 误差与算法1. 误差分为有__模型误差___, _观测误差___, __方法误差____, ___舍入误差____, Taylor 展开式近似表达函数产生的误差是_方法误差 .2. 插值余项是插值多项式的 方法误差。

0.2499作为1/4的近似值, 有几位有效数字?00.24990.249910,0m =⨯=即,031|0.2499|0.00010.5100.510,34m n n ---=<⨯=⨯=即22 3.1428751...,7=作为圆周率的近似值,误差和误差限分别是多少,有几位有效数字?2133.142875 3.14159260.00126450.5100.510---=<⨯=⨯有3位有效数字.* 有效数字与相对误差的关系3. 利用递推公式计算积分110,1,2,...,9n x n I x e dx n -==⎰错误!未找到引用源。

, 建立稳定的数值算法。

该算法是不稳定的。

因为:11()()...(1)!()n n n I n I n I εεε-=-==-111n n I I n n -=-, 10110I =4. 衡量算法优劣的指标有__时间复杂度,__空间复杂度_.时间复杂度是指: , 两个n 阶矩阵相乘的乘法次数是 , 则称两个n 阶矩阵相乘这一问题的时间复杂度为 .二 代数插值1.根据下表数据建立不超过二次的Lagrange 和Newton 插值多项式, 并写出误差估计式, 以及验证插值多项式的唯一性。

x 0 1 4f(x) 1 9 3Lagrange:设0120120,1,4;()1()9()3x x x f x f x f x ======则,, 对应 的标准基函数 为:1200102()()(1)(x 4)1()(1)(x 4)()()(01)(04)4x x x x x l x x x x x x ----===------ 1()...l x =2()...l x =因此, 所求插值多项式为:220()()()....i i i P x f x l x ===∑ (3)2()()(0)(1)(x 4)3!f R x x x ξ=--- Newton:构造出插商表:xi f(xi ) 一 二 三0 11 9 84 3 -2 -5/2所以, 所求插值多项式为:2001001201()()[,]()[,,]()()518(0)(0)(1)2...P x f x f x x x x f x x x x x x x x x x =+-+--=+----=插值余项: 2()[0,1,4,](0)(1)(x 4)R x f x x x =---2. 已知函数f(0)=1,f(1)=3,f(2)=7,则f[0,1]=___2________, f[0,1,2]=____1______)('],[000x f x x f =3.过0,1两节点构造三次Hermite 插值多项式, 使得满足插值条件: f(0)=1. .’(0)=... f(1.=2. .’(1)=1设0101010,1,()1()2'()0,'()1x x f x f x f x f x ======则,, 写出插商表:xi f(xi) 一 二 三0 10 1 01 a 1 11 a 1 0 a-1因此, 所求插值多项式为:插值余项:222()[0,0,1,1,](1)R x f x x x =-4.求f(x)=sinx 在[a,b]区间上的分段线性插值多项式, 并写出误差估计式。

数值分析计算实习题答案

数值分析计算实习题答案

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

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

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

一、插值与拟合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为待定节点。

(完整版)数值分析第一次作业

(完整版)数值分析第一次作业

问题1:20.给定数据如下表:试求三次样条插值S(x),并满足条件 (1)S`(0.25)=1.0000,S`(0.53)=0.6868; (2)S ’’(0.25)=S ’’(0.53)=0。

分析:本问题是已知五个点,由这五个点求一三次样条插值函数。

边界条件有两种,(1)是已知一阶倒数,(2)是已知自然边界条件。

对于第一种边界(已知边界的一阶倒数值),可写出下面的矩阵方程。

⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡432104321034322110d M M M M M 200020000020022d d d d λμμλμλμλ其中μj =j1-j 1-j h h h +,λi=j1-j j h h h +,dj=6f[x j-1,x j ,x j+1], μn =1,λ0=1对于第一种边界条件d 0=0h 6(f[x 0,x 1]-f 0`),d n =1-n h 6(f`n-f `[x n-1,x n ]) 解:由matlab 计算得:由此得矩阵形式的线性方程组为:⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎣⎡ 2.1150-2.4286-3.2667-4.3143-5.5200-M M M M M 25714.00001204286.000004000.026000.0006429.023571.0001243210解得 M 0=-2.0286;M 1=-1.4627;M 2= -1.0333; M 3= -0.8058; M 4=-0.6546S(x)=⎪⎪⎩⎪⎪⎨⎧∈-+-+-∈-+-+-∈-+-+-∈-+-+-]53.0,45.0[x 5.40x 9.1087x 35.03956.8.450-x 1.3637-x .5301.67881- ]45.0,39.0[x 9.30x 11.188x 54.010.418793.0-x 2.2384-x .450(2.87040-]39.0,30.0[x 03.0x 6.9544x 9.30 6.107503.0-x 1.9136-x .3902.708779-]30.0,25.0[x 5.20x 10.9662x 0.3010.01695.20-x 4.8758-x .3006.76209-33333333),()()()(),()()()),()()()(),()()()(Matlab 程序代码如下:function tgsanci(n,s,t) %n代表元素数,s,t代表端点的一阶导。

数值分析第一章作业

数值分析第一章作业

数值分析第一章作业1. 数值计算方法设计的基本手段是().(A )近似 (B ) 插值 (C ) 拟合 (D ) 迭代2. 为了在有限时间内得到结果,用有限过程取代无限过程所产生的近似解与精 确解之间的误差称为().(A )舍入误差 (B ) 截断误差 (C ) 测量误差 (D ) 绝对误差3. 由于计算机的字长有限,原始数据在机器内的表示以及进行算术运算所产生 的误差统称为().(A )舍入误差 (B ) 截断误差 (C )相对误差 (D ) 绝对误差 4. 数值计算方法研究的核心问题可以概括为()对计算结果的影响. (A )算法的稳定性(B ) 算法的收敛性 (C )算法的复杂性 (D ) 近似 N dx5. 当N 充分大时,利用下列各式计算I 二 半,等式()得到的结果最好. •N 1 +x(A ) I =arcta n (N 1)-arcta n (N ) (B )I 二 arcta n (N 2 N 1) 6.计算(、、2-1)6,取;2 1.4,利用下列哪个公式得到的结果最好 ?为什么?7. 计算球体的体积,已知半径的相对误差限不超过 3 10”,则计算所得体积的相 对误差限如何估计?8. 设x 0,近似值x 的相对误差限为:,试估计In x 的误差限.9. 计算圆柱体的体积,已知底面半径r 及圆柱高h 的相对误差限均不超过、:,则 计算所得体积的相对误差限如何估计?.10. 用秦九韶算法求f (x ) = 4x 3「3x 2 • x 「1在x = 2处的值.111. 已知近似值 X =1.0000 的误差限;(x )=1 10,, f (x )二丄 X 2,求;(f (x )),并16说明X”及f (X”)的各有几位有效数字.(C)I = arcta n( 2 N 2 N 1) (D)(A) 1(;2 1)6 (B) (3-2运3 (C) 1(3 - 2 ・(D) 99 - 70、212. 设a为非零常数,已知y0的近似值y0,由递推式y n =ay n斗计算序列{y n}的近似值,分析该算法的稳定性.。

东南大学《数值分析》上机题

东南大学《数值分析》上机题

数值分析上机题1设2211NN j S j ==-∑,其精确值为1311221N N ⎛⎫-- ⎪+⎝⎭。

(1)编制按从大到小的顺序22211121311N S N =+++---,计算N S 的通用程序。

(2)编制按从小到大的顺序2221111(1)121N S N N =+++----,计算NS 的通用程序。

(3)按两种顺序分别计算210S ,410S ,610S ,并指出有效位数。

(编制程序时用单精度) (4)通过本上机题,你明白了什么?程序代码(matlab 编程):clc cleara=single(1./([2:10^7].^2-1)); S1(1)=single(0); S1(2)=1/(2^2-1); for N=3:10^2 S1(N)=a(1); for i=2:N-1S1(N)=S1(N)+a(i); end endS2(1)=single(0); S2(2)=1/(2^2-1); for N=3:10^2 S2(N)=a(N-1);for i=linspace(N-2,1,N-2) S2(N)=S2(N)+a(i); end endS1表示按从大到小的顺序的S N S2表示按从小到大的顺序的S N通过本上机题,看出按两种不同的顺序计算的结果是不相同的,按从大到小的顺序计算的值与精确值有较大的误差,而按从小到大的顺序计算的值与精确值吻合。

从大到小的顺序计算得到的结果的有效位数少。

计算机在进行数值计算时会出现“大数吃小数”的现象,导致计算结果的精度有所降低,我们在计算机中进行同号数的加法时,采用绝对值较小者先加的算法,其结果的相对误差较小。

数值分析上机题220.(上机题)Newton 迭代法(1)给定初值0x 及容许误差ε,编制Newton 法解方程()0f x =根的通用程序。

(2)给定方程3()/30f x x x =-=,易知其有三个根1x *=,20x *=,3x *=。

北理工数值分析大作业

北理工数值分析大作业

数值分析上机作业第 1 章1.1计算积分,n=9。

(要求计算结果具有6位有效数字)程序:n=1:19;I=zeros(1,19);I(19)=1/2*((exp(-1)/20)+(1/20));I(18)=1/2*((exp(-1)/19)+(1/19));for i=2:10I(19-i)=1/(20-i)*(1-I(20-i));endformat longdisp(I(1:19))结果截图及分析:在MATLAB中运行以上代码,得到结果如下图所示:当计算到数列的第10项时,所得的结果即为n=9时的准确积分值。

取6位有效数字可得.1.2分别将区间[-10.10]分为100,200,400等份,利用mesh或surf命令画出二元函数z=的三维图形。

程序:>> x = -10:0.1:10;y = -10:0.1:10;[X,Y] = meshgrid(x,y);Z = exp(-abs(X))+cos(X+Y)+1./(X.^2+Y.^2+1);subplot(2,2,1);mesh(X,Y,Z);title('步长0.1')>> x = -10:0.2:10;y = -10:0.2:10;[X,Y] = meshgrid(x,y);Z = exp(-abs(X))+cos(X+Y)+1./(X.^2+Y.^2+1);subplot(2,2,1);mesh(X,Y,Z);title('步长0.2')>>x = -10:0.05:10;y = -10:0.05:10;[X,Y] = meshgrid(x,y);Z = exp(-abs(X))+cos(X+Y)+1./(X.^2+Y.^2+1);subplot(2,2,1);mesh(X,Y,Z);title('步长0.05')结果截图及分析:由图可知,步长越小时,绘得的图形越精确。

数值分析上机作业最强版

数值分析上机作业最强版

数值分析上机作业姓名:唐皓学号:142460专业:道路与铁道工程院系:交通学院授课教师:吴宏伟日期:2015年1月习题一1 题目17.(上机题)舍入误差与有效数 设2211NN j S j ==-∑,其精确值为1311221N N ⎛⎫-- ⎪+⎝⎭。

(1)编制按从大到小的顺序22211121311N S N =+++---,计算N S 的通用程序; (2)编制按从小到大的顺序2221111(1)121N S N N =+++----,计算N S 的通用程序; (3)按两种顺序分别计算210S ,410S ,610S ,并指出有效位数。

(编制程序时用单精度);(4)通过本上机题你明白了什么?2 通用程序代码2.1 按从小到大的顺序计算N Svoid AscendSum(unsigned long int N)// 计算从大到小的总和 {for (unsigned long int j=2;j<=N;j++) ascendSum+=(float )1.0/(j*j-1);cout<<"Sum From 1 to N (Ascend) is: "<<ascendSum<<endl; Error(ascendSum); Delimiter();} 2.2 按从大到小的顺序计算N Svoid DescendSum(unsigned long int N)//计算从小到大的总和 {for (unsigned long int j=N;j>=2;j--) descendSum+=(float )1.0/(j*j-1);cout<<"Sum From N to 1 (Descend) is: "<<descendSum<<endl; Error(descendSum); Delimiter();}3计算结果展示图1 N=100时的计算结果图2 N=10000时的计算结果图3 N=1000000时的计算结果表1-1 计算结果汇总N S 精确值按从小到大按从大到小N S 值有效位数 N S 值有效位数210S 0.7400494814 0.7400494814 10 0.740049541 6 410S 0.7498999834 0.7498521209 4 0.7498999834 10 610S0.74999898670.75185602920.752992510824 计算结果分析(1)如果采用单精度数据结构进行计算,则相较于双精度的数据结果,由于数据存储字长的限制导致计算机存在较大的舍入误差,因此本程序采用的是双精度数据存储方式。

第四章数值分析上机作业

第四章数值分析上机作业

1.用两种方法解sin 5cos 20.31x x +=-,如何一次求出此方程的四个根。

解:方法一:在Matlab 命令窗口输入命令x=solve('sin(5*x)+cos(2*x)=-0.31')运行后输出结果:x =- 0.36685340479904406504913603551901 - 0.089925518994485866153169602644131*i 方法二:在Matlab 命令窗口输入命令E1=sym('sin(5*x)+cos(2*x)=-0.31');[x1]=solve(E1)运行后输出结果:x1 =- 0.36685340479904406504913603551901 - 0.089925518994485866153169602644131*i 2.用三种方法解方程11852912312x x x x -+-=。

解:方法一:在Matlab 命令窗口输入命令x=solve('9*x^11-12*x^8+x^5-3*x^2=12')运行后输出结果:x =1.1945355092112803561808169303487 - 0.25878939596021341127295614138703 + 0.98996423045277565907337492165509*i - 0.91081125361412082546165956220494 + 0.34557668006489020731472236114125*i - 0.6567748898900820562684890790666 - 0.94093805304063227438930031737768*i - 0.6567748898900820562684890790666 + 0.94093805304063227438930031737768*i 0.34695114229720670305614226506505 + 0.85428006847946699100354057810685*i - 0.25878939596021341127295614138703 - 0.98996423045277565907337492165509*i 0.88215664256156941185655405241917 + 0.47468310614563172153151897912015*i 0.34695114229720670305614226506505 - 0.85428006847946699100354057810685*i 0.88215664256156941185655405241917 - 0.47468310614563172153151897912015*i - 0.91081125361412082546165956220494 - 0.34557668006489020731472236114125*i 方法二:在Matlab 命令窗口输入命令fa=[9,0,0,-12,0,0,1,0,0,-3,0,-12];xk=roots(fa)运行后输出结果:xk =-0.9108 + 0.3456i-0.9108 - 0.3456i-0.6568 + 0.9409i-0.6568 - 0.9409i-0.2588 + 0.9900i-0.2588 - 0.9900i1.1945 + 0.0000i0.8822 + 0.4747i0.8822 - 0.4747i0.3470 + 0.8543i0.3470 - 0.8543i方法三:在Matlab命令窗口输入命令E1=sym('9*x^11-12*x^8+x^5-3*x^2-12=0'); [x1]=solve(E1)运行后输出结果:x1 =1.1945355092112803561808169303487 - 0.25878939596021341127295614138703 + 0.98996423045277565907337492165509*i - 0.91081125361412082546165956220494 + 0.34557668006489020731472236114125*i - 0.6567748898900820562684890790666 - 0.94093805304063227438930031737768*i - 0.6567748898900820562684890790666 + 0.94093805304063227438930031737768*i 0.34695114229720670305614226506505 + 0.85428006847946699100354057810685*i - 0.25878939596021341127295614138703 - 0.98996423045277565907337492165509*i 0.88215664256156941185655405241917 + 0.47468310614563172153151897912015*i 0.34695114229720670305614226506505 - 0.85428006847946699100354057810685*i 0.88215664256156941185655405241917 - 0.47468310614563172153151897912015*i - 0.91081125361412082546165956220494 - 0.34557668006489020731472236114125*3 用MATLAB 方法求函数11852()912312f x x x x x =-+--的导数'()f x 。

东南大学 数值分析上机题作业 MATLAB版

东南大学 数值分析上机题作业 MATLAB版

东南大学数值分析上机题作业MATLAB版上机作业题报告1.Chapter 11.1题目设S N= Nj=2j2−1,其精确值为11311(-- 。

22N N +1(1)编制按从大到小的顺序S N =(2)编制按从小到大的顺序S N =111,计算S N 的通用程序。

++⋯⋯+22-132-1N 2-1111,计算S N 的通用程++⋯⋯+N 2-1(N -1 2-122-1序。

(3)按两种顺序分别计算S 102, S 104, S 106, 并指出有效位数。

(编制程序时用单精度)(4)通过本次上机题,你明白了什么?1.2程序 1.3运行结果1.4结果分析按从大到小的顺序,有效位数分别为:6,4,3。

按从小到大的顺序,有效位数分别为:5,6,6。

可以看出,不同的算法造成的误差限是不同的,好的算法可以让结果更加精确。

当采用从大到小的顺序累加的算法时,误差限随着N 的增大而增大,可见在累加的过程中,误差在放大,造成结果的误差较大。

因此,采取从小到大的顺序累加得到的结果更加精确。

2.Chapter 22.1题目(1)给定初值x 0及容许误差ε,编制牛顿法解方程f(x=0的通用程序。

3(2)给定方程f (x =x-x =0, 易知其有三个根x 1*=-3, x 2*=0, x 3*=○1由牛顿方法的局部收敛性可知存在δ>0, 当x 0∈(-δ, Newton 迭代序列收敛+δ 时,于根x2*。

试确定尽可能大的δ。

○2试取若干初始值,观察当x 0∈(-∞, -1, (-1, -δ, (-δ, +δ, (δ, 1, (1, +∞ 时Newton 序列的收敛性以及收敛于哪一个根。

(3)通过本上机题,你明白了什么?2.2程序2.3运行结果(1)寻找最大的δ值。

算法为:将初值x0在从0开始不断累加搜索精度eps ,带入Newton 迭代公式,直到求得的根不再收敛于0为止,此时的x0值即为最大的sigma 值。

数值分析作业1

数值分析作业1

11. 在计算机上怎么计算!71/2971=y 才能避免溢出?直接用matlab 计算时,m=71;b=factorial(m);%求71!c=29^m;%求29^71d=c/b得到的结果是79.54。

分析原因,可能是7129计算得到的结果太大,计算机上无法完全显示,使得最终结果出现误差。

因此可以分步计算7129229129⨯⋅⋅⋅⨯来得到结果。

用matlab 编程:clc,clear allformatdigits(4);m=71;sum=zeros(1,71);sum(1)=29;for i=2:msum(i)=sum(i-1)+29/i;endvpa(sum(71),4)运行结果:140.613.在计算机上按公式)1000,...,1(001.0,010=+==-i x x x i i ,计算1000x ,问是否必得1000x =10?为什么?分析:不一定,因为每台机器的内存不同,它所能表达的二进制就会不同。

0.001用二进制表示时,每天计算机的表示都可能有所不同,或无法准确表示出来。

用matlab 编程:clc,clear allformatdigits(4);x=zeros(1,1001);x(1)=0;for i=2:1001x(i)=x(i-1)+0.001;vpa(x(i),4);endx(1001)运行结果:1000x =1.000014.算法(1)matlab 编程:clc,clear allformatdigits(4)I1=ones(1,8);I1(1)=0.1542;for i=2:8I1(i)=1./I1(i-1)-6*I1(i-1);endvpa(I1,4)运行结果:=70~i i 0.1542, 5.56, -33.18, 199.0, -1194.0, 7166.0, -42999.0,2.58*10^5算法(2)matlab 编程:clc,clear allformatdigits(4)I2=ones(1,12);I2(12)=0;for i=12:-1:2I2(i-1)=1/(6*i)*(1-i*I2(i));endvpa(I2,4)运行结果:=70~i i 0.0751, 0.04942, 0.03679, 0.02928, 0.02431, 0.02078, 0.01815,0.0161实习题5. matlab编程:clc,clear allformatdigits(4)a=[0.33 0.333 0.3333 0.33333 0.333333];b=[1.8 1.83 1.833 1.8333 1.83333];c=[1.1 1.08 1.083 1.0833 1.08333];d=[0.78 0.783 0.7833 0.78333 0.783333];x1=ones(1,5);x2=ones(1,5);x3=ones(1,5);G=ones(1,5);for i=1:5G(i)=0.45*a(i)-a(i)^3-0.1125;x1(i)=[(0.2*a(i)-0.0625)*b(i)+(0.25*a(i)-0.1)*c(i)+(0.125 -a(i)^2)*d(i)]./G(i);x2(i)=-[(0.1-0.25*a(i))*b(i)+(a(i)^2-0.2)*c(i)+(0.25-0.5* a(i))*d(i)]./G(i);x3(i)=[(0.125-a(i)^2)*b(i)+(0.5*a(i)-0.25)*c(i)+(a(i)-0.2 5)*d(i)]./G(i);endx1=vpa(x1,4)x2=vpa(x2,4)x3=vpa(x3,4)运行结果:x1 =[ -6.222, 1.09, 1.008, 1.001, 1.0]x2 =[ 38.25, 0.488, 0.9528, 0.9953, 0.9995]x3 =[ -33.65, 1.491, 1.045, 1.005, 1.0]从运行结果可以看出,当a,b,c,d取6位近似有效数时,得到x1 =1.0,x2 =0.9995,x3 =1.0与真值最接近,当a,b,c,d取的近似有效数位数越少时,得到的结果与真值偏离很大,即误差很大。

数值分析作业

数值分析作业

1. 迭代法、初始值与收敛性(210x x --=)A 、迭代式为121-=+nn x x 时,程序为: clc;clear;x(1)=1.5;n=30;for i=2:30if i<=nx(i)=x(i-1)^2-1;endend结果为:B 、迭代式为n n x x /111+=+时,程序为:clc;clear;x(1)=1.5;n=30;for i=2:30if i<=nx(i)=x(i-1)^2-1;endend结果为:C 、迭代式为11+=+n n x x 时,程序为:clc;clear;x(1)=1.5;n=30;for i=2:30if i<=nx(i)=(x(i-1)+1)^0.5;endend结果为:由上述程序迭代结果可以看出,第一种方法不收敛,第二种和第三种迭代方法的收敛性较好,且第三种的收敛速度更快,收敛性更好。

第二种迭代方法与初始值的选取相关性不大,选取不同的初始值时,迭代次数相差不大。

第三种迭代方法与初始值选取相关性较大,当初始值较接近不动点时,迭代次数会减少。

2、分别用牛顿法、弦割法、抛物线法计算x3+4x2-10=0在[1,2]上的根。

(1)牛顿法编程调试,输入初始值x=1.5执行,计算显示的结果如下图所示:#include<stdio.h>#include<math.h>#include<stdlib.h>#include<time.h>#include<windows.h>void main(){double x,y,start,end,freq;LARGE_INTEGER t1,t2,tc;QueryPerformanceFrequency(&tc);int i=1;scanf("%lf",&x);QueryPerformanceCounter(&t1);y=x-(x*x*x+4*x*x-10)/(3*x*x+8*x);do{x=y;y=x-(x*x*x+4*x*x-10)/(3*x*x+8*x);printf("x=%f\n",x);i++;}while(fabs(x-y)>=0.0000001);printf("x=%f i=%d\n",x,i);QueryPerformanceCounter(&t2);freq=(double)tc.QuadPart;start=(double)t1.QuadPart;end=(double)t2.QuadPart;printf("cpu time: %f ",(end-start)/freq);system("pause");}(2)弦割法编程调试,输入初始值x1=1,x2=2执行,计算显示的结果如下图所示:#include<stdio.h>#include<math.h>#include<stdlib.h>#include<time.h>#include<windows.h>double f(double x){return(x+4)*x*x-10;}void main(){double x,x1,x2,start,end,freq;LARGE_INTEGER t1,t2,tc;QueryPerformanceFrequency(&tc);int i=1;scanf("%lf,%lf",&x1,&x2);QueryPerformanceCounter(&t1);x=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));do{x1=x;x=(x1*f(x2)-x2*f(x1))/(f(x2)-f(x1));printf("x=%f\n",x);i++;}while(fabs(x-x1)>=0.0000001);printf("x=%f i=%d\n",x,i);QueryPerformanceCounter(&t2);freq=(double)tc.QuadPart;start=(double)t1.QuadPart;end=(double)t2.QuadPart;printf("cpu time: %f ",(end-start)/freq);system("pause");}(3)抛物线法编程调试,输入初始值x=1,y=1.5,z=2执行,计算显示的结果如下图所示:#include<stdio.h>#include<math.h>#include<stdlib.h>#include<time.h>#include<windows.h>double fx(double x){return x*x*x+4*x*x-10 ;}void main(){double x,y,z,a,b,c,l3,d3,l4,w,start,end,freq;LARGE_INTEGER t1,t2,tc;int i=1;QueryPerformanceFrequency(&tc);scanf("%lf,%lf,%lf",&x,&y,&z);QueryPerformanceCounter(&t1);loop:l3=(z-y)/(y-x);d3=1+l3;a=fx(x)*l3*l3-fx(y)*l3*d3+fx(z)*l3;b=fx(x)*l3*l3-fx(y)*d3*d3+fx(z)*(l3+d3);c=fx(z)*d3;l4=-2*c/(b+(b/fabs(b))*pow(b*b-4*a*c,0.5));w=z+l4*(z-y);printf("%d %f\n",i,w);if(fabs(l4*(w-z))>=0.0001){x=y;y=z;z=w;i++;goto loop;}QueryPerformanceCounter(&t2);freq=(double)tc.QuadPart;start=(double)t1.QuadPart;end=(double)t2.QuadPart;printf("cpu time: %f ",(end-start)*1000/freq);system("pause");}3、分别用牛顿法、弦割法、抛物线法计算e x+10x-2=0在(1,2)上的根。

数值分析第二次作业

数值分析第二次作业

数值分析大作业(二)院系:学号:姓名:一、算法设计方案:1、矩阵A的存储和特征值的数据结构设计A是一个10×10的方阵,且由给定的元素计算公式知A是非对称的矩阵,因此采取二维数组来存储数组A。

考虑到特征值为复数的情况,采用结构体来存储特征值的实部和虚部,当特征值为实数时,虚部赋值为零。

2、求解过程的分析首先利用HouseHolder矩阵将A拟上三角化,得到A(n-1)。

然后利用带双步位移的QR分解法求解矩阵A的特征值。

利用选列主元素的高斯消去法求解A的实特征值对应的特征向量,将等式两边移项后,相当于求解齐次线性方程组。

在计算前首先要求齐次方程组的系数矩阵的秩,从而确定自由量,赋予适当的初值,从而可以求得特征值对应的一个特征值。

利用QR分解的基本方法可以得到A(n-1)进行QR分解后的Q、R和RQ。

二、源程序#include <stdio.h>#include <math.h>#define N 10#define epsilon 1E-12#define L 10000typedef struct Comp{double real;double image;}Comp;void getRealMatrix(int n,double A[][n],double Q[][n],double regulate); int isContainThisValue(int m,int mainIndex[],int index);int maxElementIndex(int m,int n,int colNum,double array[][n],int mainIndex[]);void mainElementElimination(int n,double equationArray[][n],double solveArray[],double);void qrMethod(int,double a[][]);int sgn(double realNum);void outputMatrix(int m,int n,double A[][n]);void calcMatrix(int m,int n,double A[][n],double M[][n],double s,double t);void productMatrix(int m,int n,double A[][n],double M[][n]);void hessenbergMatrix(int n,double matrix_a[][]);void solvePowerEquation(double b,double c,Comp twoDArr[2]);void qrIterateFormula(int m,int n,double M[][n],double A[][n]);void initialMatrix(int n, double A[][]);double crossProduct(double *p_1,double *p_2,int startIndex,int endIndex,int increment);void transpositionMatirx(int m,int n,double matrix[][]);void iterateFormula(int m,int n,double matrix[][],double w[],double u[],double p[]);void qrWithTwoStepMove(int n,double matrix[][],double matrix_Q[][],Comp lamdaValue[],double e,double iterCount);int main(){double Matrix_Q[N][N],Matrix_A[N][N];Comp lamdas[N];double vector[N]={0};int i,j;//初始化矩阵initialMatrix(N,Matrix_A);//拟上三角化化hessenbergMatrix(N,Matrix_A);//输出拟上三角化后的矩阵printf("A拟上三角化的矩阵:\n");outputMatrix(N,N,Matrix_A);//双步位移的QRqrWithTwoStepMove(N,Matrix_A,Matrix_Q,lamdas,epsilon,L);//求解Q、R、RQinitialMatrix(N,Matrix_A);hessenbergMatrix(N,Matrix_A);qrMethod(N,Matrix_A);for(i=0;i<=N-1;i++){printf("%.12E,%.12E\n",lamdas[i].real,lamdas[i].image);}//求解实特征值对应的特征向量initialMatrix(N,Matrix_A);for(i=0;i<=N-1;i++){if(lamdas[i].image!=0)continue;else{getRealMatrix(N,Matrix_A,Matrix_Q,lamdas[i].real);mainElementElimination(N,Matrix_Q,vector,1);printf("%.12E的特征向量为\n",lamdas[i].real);for(j=0;j<=N-1;j++)printf("%.12E ",vector[j]);printf("\n");}}return 0;}//输出矩阵void outputMatrix(int m,int n,double A[][n]){int i,j;for(i=0;i<=m-1;i++){for(j=0;j<=m-1;j++){printf("%0.12E ",A[i][j]);}printf("\n");}printf("\n");}//初始化矩阵的元素void initialMatrix(int n, double A[][n]){int i,j;for(i=0;i<=n-1;i++)for(j=0;j<=n-1;j++){if(i==j)A[i][j] = 1.5*cos((i+1)+1.2*(j+1));elseA[i][j] = sin(0.5*(i+1)+0.2*(j+1));}}//对矩阵进行拟上三角化void hessenbergMatrix(int n,double matrix_a[][n]){int r,i;double u[n],p[n],w[n],c,d,h;for(r=0;r<=n-3;r++){if(crossProduct(&matrix_a[r+2][r],&matrix_a[r+2][r],r+2,n-1,n) == 0)continue;d = sqrt(crossProduct(&matrix_a[r+1][r],&matrix_a[r+1][r],r+1,n-1,n)); c = matrix_a[r+1][r] == 0?d:(-sgn(matrix_a[r+1][r])*d);h = c*c - c*matrix_a[r+1][r];for(i=0;i<=n-1;i++){u[i] = (i<(r+1))?0:(i==(r+1))?(matrix_a[r+1][r]-c):matrix_a[i][r];}transpositionMatirx(n,n,matrix_a);for(i=0;i<=n-1;i++){p[i] = crossProduct(&matrix_a[0][0]+n*i,u,0,n-1,1)/h;}transpositionMatirx(n,n,matrix_a);for(i=0;i<=n-1;i++){w[i] = (crossProduct(&matrix_a[0][0]+n*i,u,0,n-1,1)- crossProduct(p,u,0,n-1,1)*u[i])/h;}iterateFormula(n,n,matrix_a,w,u,p);}}//双步位移的QR算法实现void qrWithTwoStepMove(int n,double matrix[][n],double matrix_Q[][n],Comp lamdaValue[],double e,double iterCount){int k,m,i=0,index=0;double s,t;Comp solver[2];k =1;m = n-1;while(1){if(fabs(matrix[m][m-1])<=e){lamdaValue[index].real = matrix[m][m];lamdaValue[index].image =0;index++;m=m-1;if(m<2){if(m==0){lamdaValue[index].real= matrix[m][m];lamdaValue[index].image = 0;index++;}else if(m==1){s = matrix[m-1][m-1]+ matrix[m][m];t = matrix[m-1][m-1]*matrix[m][m] - matrix[m][m-1]*matrix[m-1][m];solvePowerEquation(s,t,solver);for(i=0;i<=1;i++,index++)lamdaValue[index] = solver[i];}return;}}else{if(fabs(matrix[m-1][m-2])<=e){s = matrix[m-1][m-1]+ matrix[m][m];t = matrix[m-1][m-1]*matrix[m][m] - matrix[m][m-1]*matrix[m-1][m];solvePowerEquation(s,t,solver);for(i=0;i<=1;i++,index++)lamdaValue[index] = solver[i];m=m-2;if(m<2){if(m==0){lamdaValue[index].real= matrix[m][m];lamdaValue[index].image = 0;index++;}else if(m==1){s = matrix[m-1][m-1]+ matrix[m][m];t = matrix[m-1][m-1]*matrix[m][m] - matrix[m][m-1]*matrix[m-1][m];solvePowerEquation(s,t,solver);for(i=0;i<=1;i++,index++)lamdaValue[index] = solver[i];}return;}}else{if(k == iterCount)return;else{s = matrix[m-1][m-1]+ matrix[m][m];t = matrix[m-1][m-1]*matrix[m][m] - matrix[m][m-1]*matrix[m-1][m];calcMatrix(m,n,matrix,matrix_Q,s,t);qrIterateFormula(m+1,n,matrix_Q,matrix);k =k + 1;}}}}}//矩阵拟上三角化的迭代式子void iterateFormula(int m,int n,double matrix[][n],double w[],double u[],double p[]){int i,j;for(i=0;i<=m-1;i++)for(j=0;j<=m-1;j++){matrix[i][j] = matrix[i][j]-w[i]*u[j] - u[i]*p[j];}}//计算向量的内积, startIndex是起始下标,endIndex是结束下标,increment是元素增量double crossProduct(double *p_1,double *p_2,int startIndex,int endIndex,int increment){double sum = 0;int i;if(p_1 == p_2){for(i=startIndex;i<=endIndex;i++){sum += (*p_1)*(*p_1);p_1 = p_1 + increment;}}else{for(i=startIndex;i<=endIndex;i++){sum += (*p_1)*(*p_2);p_1 = p_1 + increment;p_2 = p_2 + increment;}}return sum;}//矩阵转置void transpositionMatirx(int m,int n,double matrix[][n]){int i,j;double changeVar;for(i=0;i<=m-1;i++){for(j=i;j<=m-1;j++){if(i != j){changeVar = matrix[i][j];matrix[i][j] = matrix[j][i];matrix[j][i] = changeVar;}}}}//符号函数int sgn(double realNum){return realNum== 0? 0 : (realNum>0?1:-1);}//代入的矩阵void calcMatrix(int m,int n,double A[][n],double M[][n],double s,double t){int i,j;productMatrix(m,n,A,M);for(i=0;i<=m;i++)for(j=0;j<=m;j++){M[i][j] = M[i][j] - s*A[i][j] + ((i==j)? t:0);}}//计算A平方void productMatrix(int m,int n,double A[][n],double M[][n]){int i,j,r;double sum;for(i=0;i<=m;i++)for(j=0;j<=m;j++){sum = 0;for(r=0;r<=m;r++)sum += A[i][r]*A[r][j];M[i][j]= sum;}}//计算lamdavoid solvePowerEquation(double b,double c,Comp twoDArr[2]){double delta = b*b-4*c;if(delta<0){twoDArr[0].real = b/2;twoDArr[0].image = sqrt(fabs(delta))/2;twoDArr[1].real = b/2;twoDArr[1].image = -sqrt(fabs(delta))/2;}else{twoDArr[0].real = (b+sqrt(delta))/2;twoDArr[0].image = 0;twoDArr[1].real = (b-sqrt(delta))/2;twoDArr[1].image = 0;}}//双步移位QR中的迭代公式void qrIterateFormula(int m,int n,double M[][n],double A[][n]) {int r,i;double c,d,h,u[m],v[m],p[m],w[m];for(r=0;r<=m-2;r++){if(crossProduct(&(M[r+1][r]),&(M[r+1][r]),r+1,m-1,n) == 0) {continue;}else{d = sqrt(crossProduct(&M[r][r],&M[r][r],r,m-1,n));c = (M[r][r] == 0)?d:(-sgn(M[r][r])*d);h = c*c - c*M[r][r];for(i=0;i<=m-1;i++){u[i] = (i<r)?0:(i==r)?(M[r][r]-c):M[i][r];}transpositionMatirx(m,n,M);for(i=0;i<=m-1;i++){v[i] = crossProduct(&M[0][0]+n*i,u,0,m-1,1)/h;}transpositionMatirx(m,n,M);for(i=0;i<=m-1;i++)p[i]=0;iterateFormula(m,n,M,u,v,p);//第二部分计算transpositionMatirx(m,n,A);for(i=0;i<=m-1;i++){p[i] = crossProduct(&A[0][0]+n*i,u,0,m-1,1)/h;}transpositionMatirx(m,n,A);for(i=0;i<=m-1;i++){w[i] = (crossProduct(&A[0][0]+n*i,u,0,m-1,1) - crossProduct(p,u,0,m-1,1)*u[i])/h;}iterateFormula(m,n,A,w,u,p);}}}//基本QR方法void qrMethod(int n,double A[][n]){int r,i,j;double c,d,h,sum;double u[n],w[n],p[n];double Q[n][n];double R[n][n];//初始化为单位阵for(i=0;i<=n-1;i++)for(j=0;j<=n-1;j++){if(i==j){Q[i][j]=1;R[i][j] = 0;}else{Q[i][j]=0;R[i][j] = 0;}}for(r=0;r<=n-1;r++){//判断第r列元素从 r+1行开始是否全部为0if(crossProduct(&A[r+1][r],&A[r+1][r],r+1,n-1,n)==0)continue;else{d = sqrt(crossProduct(&A[r][r],&A[r][r],r,n-1,n));c = (A[r][r] == 0)?d:(-sgn(A[r][r])*d);h = c*c - c*A[r][r];//初始化向量ufor(i=0;i<=n-1;i++){u[i] = (i<r)?0:(i==r)?(A[r][r]-c):A[i][r];}for(i=0;i<=n-1;i++){w[i] = crossProduct(&Q[0][0]+n*i,u,0,n-1,1)/h;}//辅助作用for(i=0;i<=n-1;i++)p[i]=0;//迭代出QiterateFormula(n,n,Q,w,u,p);transpositionMatirx(n,n,A);for(i=0;i<=n-1;i++){p[i] = crossProduct(&A[0][0]+n*i,u,0,n-1,1)/h;}//辅助作用for(i=0;i<=n-1;i++)w[i]=0;transpositionMatirx(n,n,A);iterateFormula(n,n,A,w,u,p);}}printf("正交阵Q: \n");outputMatrix(n,n,Q);printf("上三角阵R: \n");outputMatrix(n,n,A);for(i=0;i<=n-1;i++){for(j=0;j<=n-1;j++){sum=0;for(r=i;r<=n-1;r++)sum += A[i][r]*Q[r][j];R[i][j] = sum;}}printf("输出RQ:\n");outputMatrix(N,N,R);}//得到齐次线性方程组的系数矩阵void getRealMatrix(int n,double A[][n],double Q[][n],double regulate) {int i,j;for(i=0;i<=n-1;i++)for(j=0;j<=n-1;j++){if(i==j)Q[i][j] = A[i][j] - regulate;elseQ[i][j] = A[i][j];}}//列主元素消元法void mainElementElimination(int n,double equationArray[][n],double solveArray[],double referValue){int mainIndex[n];int temp;int k=0,i=0,j=0;double sum = 0;double ratio,afterDivide;for(i=0;i<=n-1;i++)mainIndex[i] = -1;for(k=0;k<=n-1;k++){//寻找最大元素所在的行号mainIndex[k]=maxElementIndex(n,n,k,equationArray,mainIndex);temp = mainIndex[k];for(i=0;i<=n-1;i++){if(isContainThisValue(n,mainIndex,i))continue;else{ratio = equationArray[i][k]/equationArray[mainIndex[k]][k];for(j=k;j<=n-1;j++){equationArray[i][j] = equationArray[i][j] - equationArray[mainIndex[k]][j]*ratio;afterDivide = equationArray[i][j];}}}}//代入一个设定值solveArray[n-1] = referValue;for(i=n-2;i>=0;i--){sum = 0;for(j=i+1;j<=n-1;j++){sum += equationArray[mainIndex[i]][j]*solveArray[j];}solveArray[i] = - sum/equationArray[mainIndex[i]][i];}}//返回一列中最大元素的下标int maxElementIndex(int m,int n,int colNum,double array[][n],int mainIndex[]){int maxIndex=0;int i=0,j=0;double max = array[0][colNum];for(i=0;i<=m-1;i++){if(!isContainThisValue(m,mainIndex,i)){max = array[i][colNum];maxIndex = i;break;}}for(i++;i<=m-1;i++){if(isContainThisValue(m,mainIndex,i))continue;if(max<array[i][colNum]){max = array[i][colNum];maxIndex = i;}}return maxIndex;}//判断index是否在mainIndex数组中int isContainThisValue(int m,int mainIndex[],int index) {int i = 0;for(i=0;i<=m-1;i++){if(index == mainIndex[i])return 1;}return 0;}三、计算结果。

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

数值分析计算机作业
电信少41 刘星辰 2120406102
1.用列主元高斯消去法求解线性方程组
⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡-----------------=9172127141118921127134217231111615712291159118324653A ,⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦
⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡=2585929211b
解:代码如下
function x=nagauss2(a,b,flag)
a=[3 -5 6 4 -2 -3 8;
1 1 -9 15 1 -9 2;
2 -1 7 5 -1 6 11;
-1 1 3 2 7 -1 -2;
4 3 1 -7 2 1 1;
2 9 -8 11 -1 -4 -1;
7 2 -1 2 7 -1 9];
b=[11;2;29;9;5;8;25];
if nargin<3,flag=0;end
n=length(b);
a=[a b];
for k=1:n-1
%选主元
[ap,p]=max(abs(a(k:n,k)));
p=p+k-1;
if p>k
t=a(k,:);
a(k,:)=a(p,:);
a(p,:)=t;
end
%消元
a((k+1):n,(k+1):(n+1))=a((k+1):n,(k+1):(n+1))-a((k+1):n,k)/a(k,k)*a(k ,(k+1):(n+1));
a((k+1):n,k)=zeros(n-k,1);
if flag==0,a,end
end
%回代
x=zeros(n,1);
x(n)=a(n,n+1)/a(n,n);
for k=n-1:-1:1
x(k,:)=(a(k,n+1)-a(k,(k+1):n)*x((k+1):n))/a(k,k); end
过程截图:
结果为:
2.分别用Jacobi 迭代和Gauss-Seidel 迭代求解线性方程组
⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡--------=3000500451500015251005
010*********A ,⎥⎥
⎥⎥⎥



⎢⎢⎢⎢⎢⎢⎣⎡=000010b
解:(1)Jacobi 迭代
代码如下:
function x=najb(a,b,x0,e,N)
a=[28 -3 0 0 0;
-3 38 -10 0 -5;
0 -10 25 -15 0;
0 0 -15 45 0;
0 -5 0 0 30];
b=[10;0;0;0;0];
n=length(b);
if nargin<5,N=500;end
if nargin<4,e=1e-4;end
if nargin<3,x0=zeros(n,1);end
x=x0;
x0=x+2*e;
k=0;
a1=tril(a);
a2=inv(a1);
while norm(x0-x,inf)>e&k<N
k=k+1;
x0=x;
x=-a2*(a-a1)*x0+a2*b;
disp(x')
end
if k==N,waring('已达迭代次数上限');end 迭代过程如下:
最终结果为:
(2)Gauss-Seidel迭代
代码如下:
function x=nags(a,b,x0,e,N)
a=[28 -3 0 0 0;
-3 38 -10 0 -5;
0 -10 25 -15 0;
0 0 -15 45 0;
0 -5 0 0 30];
b=[10;0;0;0;0];
n=length(b);
if nargin<5,N=500;end
if nargin<4,e=1e-4;end
if nargin<3,x0=zeros(n,1);end
x=x0;
x0=x+2*e;
k=0;
a1=diag(diag(a));
a2=inv(a1);
while norm(x0-x,inf)>e&k<N
k=k+1;
x0=x;
x=(eye(n)-a2*a)*x0+a2*b;
disp(x')
end
if k==N,waring('已达迭代次数上限');end 迭代过程如下:
最终结果为:
感想:
整个作业的完成不仅需要结合课上所学知识和PPT上的例程,也要加以理解、分析,才能写出正确的代码,得到理想的结果。

代码只是工具,理解三种方法的思路才是完成这次作业的重点。

相关文档
最新文档