(完整word版)数值分析课程设计含代码

合集下载

数值分析(计算方法)课程设计实验报告(附程序)

数值分析(计算方法)课程设计实验报告(附程序)

n=4 时,max[L(X)-h(X)]=0.4020;
n=8 时,max[L(X)-h(X)]=0.1708;
n=10 时,max[L(X)-h(X)]=0.1092。
图象分析: 从图象可以看出随着插值节点数的增加出现异常的摆动,中间能较好的接近 原函数,但两边却出现很大的误差。
(3).对定义在(-5,5)上的函数
程序代码 2:
x=[-1:0.2:1]; y=1./(1+25.*x.^2); x0=[-1:0.01:1]; y0=lagrange(x,y,x0); y1=1./(1+25.*x0.^2);
plot(x0,y0,'--r'); hold on; plot(x0,y1,'-b'); x2=abs(y0-y1); max(x2) ; 程序代码3: n=3; for i=1:n x(i)=cos(((2.*i-1).*pi)./(2.*(n+1))); y(i)=1./(1+25.*x(i).*x(i)); end x0=-1:0.01:1; y0=lagrange(x,y,x0); y1=1./(1+25.*x0.^2); plot(x0,y0,'--r') hold on plot(x0,y1,'-b')
以 x1,x2,„,xn+1 为插值节点构造上述各函数的 Lagrange 插值多项式, 比较其 结果。
设计过程: 已知函数 f(x)在 n+1 个点 x0,x1,…,xn 处的函数值为 y0,y1,…,yn 。 求一 n 次多 项式函数 Pn(x),使其满足: Pn(xi)=yi,i=0,1,…,n. 解决此问题的拉格朗日插值多项式公式如下

2010版数值分析教学大纲(最新)

2010版数值分析教学大纲(最新)

《数值分析》课程教学大纲课程代码:090141031课程英文名称:Numerical Analysis课程总学时:64 讲课:64 实验:0 上机:0适用专业:信息与计算科学专业大纲编写(修订)时间:2010.07一、大纲使用说明(一)课程的地位及教学目标《数值分析》是为信息与计算科学专业学生开设的必修课。

在实验方法和理论方法之后,科学计算已成为科学研究的第三种方法。

学习和掌握计算机上常用的数值计算方法已成为现代科学教育的重要内容。

通过本课程的学习,使学生了解和掌握这门课程所涉及的各种常用的数值计算公式、数值方法的构造原理及适用范围,为今后用计算机去有效地解决实际问题打下基础。

通过本课程的学习,学生将达到以下要求:1.掌握数值计算的基本理论和基本方法,提高数学素养;2.具有运用Matlab等工具进行具有一定难度和复杂度的数值解运算的技能,提高应用计算机进行科学与工程计算的能力;3.树立正确的算法设计理念;4.了解数值计算方法的新发展。

(二)知识、能力及技能方面的基本要求1.知识方面的基本要求:掌握算法的基本原理和思想,包括算法的构造、算法处理的技巧、误差分析、收敛性和稳定性等基本理论。

2.基本理论和方法:误差与有效数字定义、函数插值与逼近的方法、积分与微分的数值计算方法、线性方程组的直接解法、线性方程组的迭代法、非线性方程根的求解方法、常微分方程初值问题的数值解法等3.基本能力:使用各种数值方法解决实际计算问题。

不仅要学会“怎样算”,而且必须做到“真会算”,即不仅要知道问题的解是存在的,还必须能求出具体的结果。

具有应用计算机进行科学与工程计算和解决实际问题的能力。

(三)实施说明1.教学方法:课堂讲授中要重点对算法的构造、算法处理技巧和误差分析的讲解;采用启发式教学,培养学生思考问题、分析问题和解决问题的能力;引导和鼓励学生通过实践和自学获取知识,培养学生的自学能力;增加讨论课,调动学生学习的主观能动性;讲课要联系实际并注重培养学生的创新能力。

数值分析课程设计

数值分析课程设计

仿真结果
• 电位三维立体图
仿真结果
• 等位线LAB源程序
• 绘图程序如下:
• • • • • • • • subplot(1,2,1),meshc(VPlot); %画含等高线的三维曲面 xlabel('x');ylabel('y');zlabel('空间电位'); subplot(1,2,2),axis([-xMax,xMax,-xMax,xMax,]); cs=contour(x,y,VPlot); %画等高线,cs是等高线值 clabel(cs); %在等高线图上加上编号 hold on; %在等高线图上加上电场 quiver(x,y,ExPlot,EyPlot); xlabel('x');ylabel('y');
MATLAB源程序
• 计算程序如下:
• • • • • • sym x; %定义符号变量x sym y; %定义符号变量y VPlot=log(x.^2+y.^2); %电位表达式 xMax=5; NGrid=20; %设置绘图区域和网格线数 xPlot=linspace(-xMax,xMax,NGrid); [x,y]=meshgrid(xPlot); %x,y取同样范围,生成二维网格 • [Explot,Eyplot]=gradient(-VPlot); %求解电场
《数值分析》课程设计
数学模型
• 本设计解决的是关于电磁场的两个基础性 问题:静电场场量的计算和场图的绘制。 • 本设计建立数学模型如下: • 已知空间电位分布为: V (x,y,z)=log(x2+y2) 计算空间各点电场,并画出电位线和电力线。
MATLAB源程序

数值分析课程设计

数值分析课程设计

数值分析课程设计一、题目描述在本次数值分析课程设计中,我们需要实现下列内容:给定一个函数f(x),任取一个初值x0,使用牛顿法求出f(x)=0的一个根。

二、算法实现在数值计算中,牛顿法(Newton’s method) 是一种迭代算法,可以快速地求解方程的数值解,对于一般的实数函数,牛顿法可以用来求方程f(x)=0的根。

设x n是f(x)的根的一个近似值,y=f(x n)是对应的函数值,则用f(x)的一阶泰勒展开式$$ f(x) \\approx f(x_n)+f'(x_n)(x-x_n) $$且令上式等于零,得到牛顿迭代公式:$$ x_{n+1}=x_n-\\frac{f(x_n)}{f'(x_n)} $$若x0是f(x)的一个根的初始近似值,则$$ x_{n+1}=x_n-\\frac{f(x_n)}{f'(x_n)}, \\ n=0,1,2,\\cdots $$是迭代序列,如果 $\\lim\\limits_{n\\rightarrow \\infty}x_n=\\alpha$,且 $f(\\alpha)=0$,则 $\\alpha$ 是方程的一个根。

三、实验步骤1.确定初始值x0,计算f(x0)和f′(x0)。

2.按照牛顿法迭代公式计算x n+1。

3.如果满足指定的条件,则停止迭代,并输出x n+1。

4.否则,返回第二步迭代计算x n+2,直至满足指定的条件。

四、实验代码def newton_method(f, df, x0, eps=1e-8, max_iter=1000):'''利用牛顿法求解非线性方程f(x)=0的根。

:param f: 函数:param df: 导函数:param x0: 初值:param eps: 容差:param max_iter: 最大迭代次数:return:近似解'''n =1while True:x1 = x0 - f(x0) / df(x0)if abs(x1 - x0) < eps or n > max_iter:return x1x0 = x1n +=1五、实验结果我们使用上述实现的牛顿法来解决如下问题:$$ f(x) = x^2-3, \\ x_0=2 $$则f′(x)=2x。

数值分析方法课程设计

数值分析方法课程设计

数值分析方法课程设计背景介绍数值分析是一门研究求解各种数学问题的有效数值计算方法的学科,其应用广泛,如科学计算、工程设计和金融计算等领域。

在数值分析中,许多方法依赖于计算机的计算能力。

此外,数值分析还需要对数学理论和计算机科学两方面的知识有较深的理解。

本课程设计旨在通过实践,帮助学生深入了解数值分析方法及其应用,并提高学生的计算机编程能力。

课程设计目标•熟练掌握数值分析中的基本算法和方法,如插值法、数值积分等•能够将所学算法应用于实际问题,并编写可靠的程序解决问题•加深对计算机编程的理解和掌握,增强编程实践和创新能力•提高对数值分析和计算机科学交叉领域的理解课程内容第一部分:基本算法和方法1.数值微积分基本概念和原理2.插值法及其在实际中的应用3.数值积分的基本方法和理论基础4.常微分方程常用数值解法第二部分:实践应用与编程实现1.利用插值法和数值积分求解实际问题2.实现数值微积分和常微分方程的求解程序3.利用现有的数值分析软件解决实际问题,如 MATLAB 和 Python 等课程设计方案1.向学生介绍数值分析基本算法和方法,并讲解其理论基础和实际应用。

2.向学生提供一些实际问题,引导学生根据所学算法和方法进行求解。

3.给予学生一定的编程实践机会,让他们能够将所学算法实现为程序,并运用到具体的问题中。

4.通过课程作业、仿真实验等形式对学生进行考核和评价,确保学生能够有效掌握所学知识和能力。

评价标准1.学生掌握数值分析基本算法和方法的程度2.学生在实际问题中应用所学算法的能力3.学生编程实践和创新能力的水平4.学生对数值分析和计算机科学交叉领域的理解总结本课程设计旨在培养学生的数值分析和计算机编程实践,通过课程作业和编程实践等形式将理论知识与实际问题相结合,提高学生的实践应用能力。

同时,本课程设计也为学生未来的研究和工作提供了一定的基础。

数值分析各种代码

数值分析各种代码

function x=tridiagsolver(a,b)[n,n]=size(a);for i=1:nif i==1l(i)=a(i,i);y(i)=b(i)/l(i);elsel(i)=a(i,i)-a(i,i-1)*u(i-1);y(i)=(b(i)-y(i-1)*a(i,i-1))/l(i);endif i<nu(i)=a(i,i+1)/l(i);endendx(n)=y(n);for j=n-1:-1:1x(j)=y(j)-u(j)*x(j+1);end拉格朗日function yh=lagrange(x,y,xh)n=length(x);m=length(xh);yh=zeros(1,m);c1=ones(n-1,1);c2=ones(1,m);for i=1:nxp=x([1:i-1 i+1:n]);yh=yh+y(i)*prod((c1*xh-xp'*c2)./(x(i)-xp'*c2));end线性x=[x1,x2] y=[y1.y2] xh=[xh]抛物线X=[x1,x2,x3] y=[y1,y2,y3] xh=[xh]牛顿差商(输入x,y为列向量)function [p,q]=chashang(x,y)n=length(x);p(:,1)=x;p(:,2)=y;for j=3:n+1p(1:n+2-j,j)=diff(p(1:n+3-j,j-1))./(x(j-1:n)-x(1:n+2-j)); endq=p(1,2:n+1)';三次样条x=[0 1 2 3];y=[0.2 0 0.5 2.0 1.5 -1];pp=csape(x,y,'complete')[breaks,coefs,npolys,ncoefs,dim]=unmkpp(pp)x=[0.24 0.65 0.95 1.24 1.73 2.01 2.23 2.52 2.77 2.99]';y=[0.23 -0.26 -1.1 -0.45 0.27 0.1 -0.29 0.24 0.56 1]';A=[log(x) cos(x) exp(x)];Z=A\y;a0=Z(1)a1=Z(2)a2=Z(3)x=[0 0.25 0.50 0.75 1.00];y=[1.00 1.284 1.6487 2.1170 2.7183];p=polyfit(x,y,2)a2=p(1)a1=p(2)a0=p(3)复合中点function I=fmid(fun,a,b,n)h=(b-a)/n;x=linspace(a+h/2,b-h/2,n);y=feval(fun,x);I=h*sum(y);复合梯形function I=ftrapz(fun,a,b,n)h=(b-a)/n;x=linspace(a,b,n+1);y=feval(fun,x);I=h*(0.5*y(1)+0.5*y(n+1)+sum(y(2:n)));复合辛普森function I=fsimpson(fun,a,b,n)h=(b-a)/n;x=linspace(a,b,2*n+1);y=feval(fun,x);I=h/6*(y(1)+y(2*n+1)+2*sum(y(3:2:2*n-1))+4*sum(y(2:2:2*n)));雅克比迭代function [x,iter]=jacobi(A,b,tol)D=diag(diag(A));L=D-tril(A);U=D-triu(A);x=zeros(size(b));for iter=1:500x=D\(b+U*x+L*x);error=norm(b-A*x)/norm(b);if (error<tol)break;endGS迭代function [x,iter]=GS(A,b,tol)D=diag(diag(A));L=D-tril(A);U=D-triu(A);x=zeros(size(b));for iter=1:500x=(D-L)\(b+U*x);error=norm(b-A*x)/norm(b);if (error<tol)break;endendSOR迭代function [x,iter]=SOR(A,b,omega,tol)D=diag(diag(A));L=D-tril(A);U=D-triu(A);x=zeros(size(b));for iter=1:500x=(D-omega*L)\(omega*b+(1-omega)*D*x+omega*U*x); error=norm(b-A*x)/norm(b);if (error<tol)break;endend二分法function v=f(x)v=x^3-x-1;function x=erfenfa(f,a,b,tol)if nargin<4tol=1e-5;endfa=feval(f,a);fb=feval(f,b);while abs(a-b)>tolx=(a+b)/2;fx=feval(f,x);if sign(fx)==sign(fa)a=x;fa=fx;elseif sign(fx)==sign(fb)b=x;fb=fx;endend>> x=erfenfa('f',1,2)牛顿法function [x,it]=newton(f,g,x0,tol)it=0;done=0;while ~donex=x0-feval(f,x0)/feval(g,x0);it=it+1;done=(norm(x-x0)<=tol);if ~donex0=x;endendfunction r=f(x)r=polyval([1,2,10,-20],x);function r=g(x)p=polyder([1,2,10,-20]);r=polyval(p,x);牛顿下山法乘幂法function [t,y]=chengmifa(a,xinit,ep) v0=xinit;[tv,ti]=max(abs(v0));lam0=v0(ti);u0=v0/lam0;flag=0;while ~flagv1=a*u0;[tv,ti]=max(abs(v1));lam1=v1(ti);u0=v1/lam1;err=abs(lam0-lam1);if err<epflag=1endlam0=lam1;endt=lam1;y=u0;反幂法function [t,y]=fanmifa(a,xinit,ep)v0=xinit;[tv,ti]=max(abs(v0));lam0=v0(ti);u0=v0/lam0;flag=0;while ~flagv1=inv(a)*u0;[tv,ti]=max(abs(v1));lam1=v1(ti);u0=v1/lam1;err=abs(lam0-lam1);if err<epflag=1;endlam0=lam1;endt=1/lam1;y=u0;改进欧拉法function [x,y]=odeIEuler(f,y0,a,b,n) h=(b-a)/n;x=a:h:b;y(1)=y0;for i=1:nyp=y(i)+h*feval(f,x(i),y(i));yc=y(i)+h*feval(f,x(i+1),yp);y(i+1)=1/2*(yp+yc);endfunction r=f(x,y)r=y-2*x/y;。

《数值分析》课程设计

《数值分析》课程设计

1.直接三角形分解#include<stdio.h>#include<math.h>#define N 10double a[N][N],b[N],X[N],Y[N],u[N][N],v[N][N],c[N][N];int n;void input(){int i,j;printf("请输入矩阵的阶数n=");scanf("%d",&n);printf("请输入矩阵的各项元素(按矩阵形式输入以空格隔开)a[n][n]:\n");for(i=0;i<n;i++)for(j=0;j<n;j++)scanf("%lf",&a[i][j]);printf("请输入矩阵的常数列:\n");for(i=0;i<n;i++)scanf("%lf",&b[i]);}void solveUandV(){int i,j,k;double temp1,temp2;for(i=n-1;i>=0;i--){for(j=i;j>=0;j--){temp1=0;for(k=i+1;k<n;k++){temp1+=u[j][k]*v[k][i];}u[j][i]=a[j][i]-temp1;temp2=0;for(k=i+1;k<N;k++){temp2+=u[i][k]*v[k][j];}v[i][j]=(a[i][j]-temp2)/u[i][i];}}printf("上三角u为:\n");for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%lf\t",u[i][j]);printf("\n");}printf("下三角单位矩阵v为:\n");for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%lf\t",v[i][j]);printf("\n");}}void substituting(){int i,j;double temp1,temp2;printf("中间解Y=\n");for(i=n-1;i>=0;i--){temp1=0;for(j=i+1;j<n;j++)temp1+=Y[j]*u[i][j];Y[i]=(b[i]-temp1)/u[i][i];printf("%lf\t\t",Y[i]);}printf("\n");for(i=0;i<n;i++){temp2=0;for(j=0;j<i;j++){temp2+=X[j]*v[i][j];}X[i]=Y[i]-temp2;}}void verification(){int i,j,k;double t;for(i=0;i<n;i++){for(j=0;j<n;j++){t=0;for(k=0;k<n;k++)t+=u[i][k]*v[k][j];c[i][j]=t;}}printf("原系数矩阵为:\n");for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%lf\t",c[i][j]);printf("\n");}}void output(){int i;printf("方程的解为:\n");for(i=0;i<n;i++)printf("x[%d]= %lf\n",i,X[i]); }void main(){input();solveUandV();substituting();verification();output();}结果:#include"iostream.h"#include"math.h"#define e 0.00000000000001 double f(double x){double y;if (x==0){return y=1.0;}else y=sin(x)/x;return y;}void romberg(double a,double b) {int n=1,k=0;double h,T2,S2=0,C2=0,R2=0,T1,C1,S1,R1;h=(b-a)/2;T2=h*(f(a)+f(b));while (fabs((R2-R1))>e){R1=R2;T1=T2;S1=S2;C1=C2;double sum=0;int i;for(i=1;i<=n;i++){sum=sum+f(a+(2*i-1)*h);}T2=T1/2+sum*h;S2=(4*T2-T1)/3;C2=(16*S2-S1)/15;R2=(64*C2-C1)/63;n=n*2;k++;h=h/2;}cout<<"*****最后结果为:"<<"I="<<R2<<endl;}void main(){double a,b;cout<<"***输入上下限a,b的值用空格隔开***"<<endl;cin>>a>>b;cout<<"***下限a="<<a<<endl;cout<<"***上限b="<<b<<endl;cout<<"***被积函数为:y=sin(x)/x"<<endl;cout<<"*********************结果如下*********************"<<endl;romberg(a,b);}牛顿插值:#include <iostream.h>#include <math.h>void main(){int n,i,j;double A[50][50];double x[50],y[50];double K=1,X=0,N=0,P;cout<<"请输入所求均差阶数:";cin>>n;for(i=0;i<=n;i++){cout<<"请输入x"<<i<<"=";cin>>x[i];cout<<"请输入y"<<i<<"=";cin>>y[i];A[i][0]=x[i]; A[i][1]=y[i];}for(j=2;j<=n+1;j++){for(i=1;i<=n;i++){A[i][j]=(A[i][j-1]-A[i-1][j-1])/(A[i][0]-A[i-j+1][0]);}}for(i=0;i<=n;i++){cout<<"输出第"<<i<<"阶均差为:"<<A[i][i+1]<<endl;}cout<<"请所要代入计算的x的值:X=";cin>>X;for(i=0;i<n;i++){K*=X-x[i];N+=A[i+1][i+2]*K;P=A[0][1]+N;}cout<<"所要求的函数值为:y="<<P<<endl;}(1)Jacobi迭代法#include<stdio.h>#include<math.h>void main(){float a[10][11],x1[10],x2[10],temp=0,fnum=0; int i,j,n,bk=0;printf("输入方程组的未知数的个数(n<10):\nn="); scanf("%d",&n);for(i=1;i<n+1;i++)x1[i]=0;printf("\n输入方程组的系数矩阵:\n");for(i=1;i<n+1;i++){j=1;while(j<n+1){printf("a%d%d=",i,j);scanf("%f",&a[i][j]);j++;}}printf("输入方程组的常数项:\n");for(i=1;i<n+1;i++){printf("b%d=",i);scanf("%f",&a[i][n+1]);}printf("\n");while(bk!=1){for(i=1;i<n+1;i++){for(j=1;j<n+1;j++){if (j!=i)temp=a[i][j]*x1[j]+temp;}x2[i]=(a[i][n+1]-temp)/a[i][i]; temp=0;}for(i=1;i<n+1;i++){fnum=float(fabs(x1[i]-x2[i])); if(fnum>temp) temp=fnum;}if(temp<=pow(10,-4)) bk=1;for(i=1;i<n+1;i++)x1[i]=x2[i];}printf("原方程组的解为:\n");for(i=1;i<n+1;i++){printf("x%d=%7.4f ",i,x1[i]); printf("\n");}}(2)Gauss-Seidel迭代法# include <stdio.h># include <math.h>double sd(double c[3][3],double d[3],int n,double x[3],double ep,int ip,int nmax) {int i,j,k;double emax,s;k=0;do{emax=0;for(i=0;i<n;i++){s=d[i];for(j=0;j<n;j++){s=s+c[i][j]*x[j];}if(fabs(s-x[i])>emax) emax=fabs(s-x[i]);x[i]=s;}k=k+1;}while((emax>ep)&&(k<nmax));if(k>=nmax) ip=-1;else ip=1;return(x[0],x[1],x[2]);}void main(){double ep;int n,ip,nmax;double c[3][3]={{0,0.2,0.1},{0.2,0,0.1},{0.2,0.4,0}};static double d[3]={0.3,1.5,2};static double x[3]={0,0,0};n=3;ip=1;ep=0.000001;nmax=10;sd(c,d,3,x,ep,ip,nmax);if(ip==1){printf("Guass-Seideln");printf("the solution of equestion:n");printf("x1=%1.10fnx2=%1.10fnx3=%1.10fn",x[0],x[1],x[2]);} else printf("seidel method is failure");}。

数值分析课程设计含代码

数值分析课程设计含代码

课程设计任务书实验方法与理论方法是推动科学技术发展的两大基本方法,但有局限性。

许多研究对象,由于空间或时间的限制,既不可能用理论精确描述,也不能用实验手段实现。

数值模拟或称为科学计算突破了实验和理论科学的局限,在科技发展中起到越来越重要的作用。

可以认为,科学计算已于实验、理论一起成为科学方法上不可或缺的三个主要手段。

计算数学的研究是科学计算的主要组成部分,而数值分析则是计算数学的核心。

数值计算是研究使用计算机来解决各种数学问题的近似计算方法与理论,其任务是提供在计算机上可解的、理论可靠的、计算复杂性低的各种常用算法。

数值分析的主要内容:1)、数值代数:求解线性和非线性方程组的解,分直接方法和间接方法两大类;2)、插值、曲线拟合和数值逼近;3)、数值微分和数值积分;4)、常微分和偏微分方程数值解法。

本文主要通过Matlab软件,对数值分析中的一些问题进行求解,如列主元Gauss消去法,Lagrange插值多项式,复化Simpson公式,Runge-Kutta方法以及数值分析在实际问题中的应用,并在求解的过程中更加熟识这门课程的主要内容,以及加强对课程知识的掌握。

在学习与设计计算方法时,从数学理论角度,学会分析方法的误差、收敛性和稳定性,保证计算方法的准确性;从实际应用的角度出发,掌握计算方法的结构与流程,能够把计算方法转换为可在计算机上直接处理的程序,保证算法的可用性。

关键词:列主元Gauss消去法;Lagrange插值;复化Simpson公式;Runge-Kutta实验一列主元Gauss消去法 (1)1.1 实验目的 (1)1.2 基本原理 (1)1.3 实验内容 (2)1.4 实验结论 (3)实验二拉格朗日插值多项式 (4)2.1 实验目的 (4)2.2 基本原理 (4)2.3 实验内容 (4)2.4 实验结论 (9)实验三复化Simpson求积公式 (10)3.1 实验目的 (10)3.2 基本原理 (10)3.3 实验内容 (10)3.4 实验结论 (12)实验四龙格-库塔(Runge-Kutta)方法 (13)4.1 实验目的 (13)4.2 基本原理 (13)4.3 实验内容 (14)4.4 实验结论 (15)实验五数值方法实际应用 (16)5.1 实验目的 (16)5.2 基本原理 (16)5.3 实验内容 (16)5.4 实验结论 (22)参考文献 (23)实验一 列主元Gauss 消去法1.1 实验目的1) 理解列主元消去法的原理;2) 熟悉列主元消去法的计算步骤,能用代码编写; 3) 解决实际问题。

(完整word版)数值分析课程设计实验二

(完整word版)数值分析课程设计实验二

实验二2.1一、题目:用高斯消元法的消元过程作矩阵分解。

设20231812315A ⎡⎤⎢⎥=⎢⎥⎢⎥-⎣⎦消元过程可将矩阵A 化为上三角矩阵U ,试求出消元过程所用的乘数21m 、31m 、31m 并以如下格式构造下三角矩阵L 和上三角矩阵U(1)(1)212223(2)313233120231,1L m U a a m m a ⎡⎤⎡⎤⎢⎥⎢⎥==⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦验证:矩阵A 可以分解为L 和U 的乘积,即A =LU 。

二、算法分析:设矩阵111213212223313233a a a A a a a a a a ⎛⎫ ⎪= ⎪ ⎪⎝⎭,通过消元法可以将其化成上三角矩阵U ,具体算法如下: 第1步消元:111111(1)22112(1)331130,0;;2,3;i i i i i i i i a m a a a a m a i a a m a +=≠⎧⎪=+=⎨⎪=+⎩ 得到111213(1)(1)12223(1)(1)323300a a a A a a a a ⎛⎫ ⎪= ⎪ ⎪⎝⎭第2步消元:(1)(1)(1)32322222(2)(1)(1)333332230,0;;a m a a a a m a ⎧+=≠⎪⎨=+⎪⎩ 得到的矩阵为111213(1)(1)22223(2)33000a a a A a a a ⎛⎫ ⎪= ⎪ ⎪⎝⎭三、程序及运行结果b1.mA=[20 2 3;1 8 1;2 -3 15];for i=1:2M(i)=A(i+1,1)/A(1,1);endfor j=2:3A1(j,2)=A(j,2)-M(j-1)*A(1,2);A1(j,3)=A(j,3)-M(j-1)*A(1,3);endM(3)=A1(3,2)/A1(2,2);A1(3,2)=0;A1(3,3)=A1(3,3)-M(3)*A1(2,3);M,A1运行结果为:M =0.0500 0.1000 -0.4051A1 =0 0 00 7.9000 0.85000 0 15.0443所以:10020230.051007.90.850.10.405110015.0443L U ⎛⎫⎛⎫ ⎪ ⎪== ⎪ ⎪ ⎪ ⎪-⎝⎭⎝⎭验证:L=[1 0 0;0.05 1 0;0.1 -0.4051 1];U=[20 2 3;0 7.9 0.85;0 0 15.0443];A1=L*UA1 =20.0000 2.0000 3.00001.0000 8.0000 1.00002.0000 -3.0003 15.0000四、精度分析因为根据LU 的递推公式可知,L ,U 分别为下三角和上三角矩阵,其中L 不在对角线上的元素值为111()k ik ik is sk s kk l a l u u -==-∑,在计算每个系数时会产生相应的计算误差。

数值分析课程设计目录+正文

数值分析课程设计目录+正文

一、目录一、目录 (1)二、设计内容 (2)1.Gauss列主元素消去法解线性方程组的算法设计 (2)1.1 模块设计 (2)1.2主要程序代码 (2)1.3 运行结果 (5)2.Romberg算法 (6)2.1模块设计 (6)2.2 主要程序代码 (6)2.3 运行结果 (7)三、小结 (8)四、参考文献 (8)二、设计内容1.Gauss列主元素消去法解线性方程组的算法设计1.1 模块设计求任意阶(n<10)线性方程组的能力,主要包括一下模块:(1)在源程序中定义求解的方程阶数;(2)输入方程的系数矩阵和常数矩阵;(3)获取增广矩阵(4)Gauss列主元素消去:找主元、消元(分解)、回代、输出结果。

1.2主要程序代码#include <iostream.h>#include <iomanip.h>#include <math.h>#define n 4class Guss{private:float a[n][n];float b[n];float Array[n][n+1];public:Guss() //构造矩阵{cout<<"请输入"<<n<<"*"<<n<<"维系数矩阵:"<<endl;for(int i = 0;i<n;i++) // 输入系数矩阵{for(int j = 0;j<n;j++)cin>>a[i][j];}cout<<"请输入"<<1<<"*"<<n<<"维常数矩阵:"<<endl;for(i = 0;i<n;i++) // 输入常数矩阵{cin>>b[i];}/* for(int i1 = 0;i1<n;i1++){for(int j1 =0;j1<n+1;j1++){cout<<a[i1][j1]<<setw(15);}cout<<b[i1];cout<<endl;}*/}void zgjz() //获得增广矩阵{// float c[n][n+1]; //定义增广矩阵// float *p;// p = &a[0][0];for(int i = 0;i<n;i++) //有系数矩阵和常数矩阵获得增广矩阵205 {for(int j = 0;j<n+1;j++){if(j == n)Array[i][j] = b[i];elseArray[i][j] = a[i][j];}}// return &c[0][0];// return *p; //返回增广矩阵cout<<"增广矩阵为:"<<endl;for(int i1 = 0;i1<n;i1++){for(int j1 =0;j1<n+1;j1++){cout<<Array[i1][j1]<<setw(15);}cout<<endl;}}void Gjfc() //Guss列主元素消元法{float max,u,z; //定义三个float变量,max标记最大值,u用来交换,z用来计算最后的结果int flag; //flag用来标记下标for(int i = 0;i<n-1;i++){max = Array[i][i];flag = i;for(int k = i+1;k<n;k++){if(fabs(max) < fabs(Array[k][i])) //找主元{max = Array[k][i];flag = k;}}if(flag != i){for(int j = i;j<n+1;j++){u = Array[i][j];Array[i][j] = Array[flag][j];Array[flag][j] = u;}}for(int x = i+1;x<n;x++) //消元{u = Array[x][i]/max;for(int y = i;y<n+1;y++){Array[x][y] = Array[x][y]-u*Array[i][y];}}}for(int x=n-1;x>=0;x--) //回代{z=0;for(int y=x+1;y<n;y++)z=z+Array[x][y]*Array[y][n];Array[x][n]=(Array[x][n]-z)/(Array[x][x]);//计算结果}cout<<"Guss消元所得方程组的解为:"<<endl;for(i = 0;i<n;i++) //输出结果cout<<Array[i][n]<<setw(15);cout<<endl;}};//类的结束int main(){Guss G;// float Array[n][n+1];G.zgjz();G.Gjfc();return 0;}1.3 运行结果2.Romberg算法2.1模块设计利用递推的复合梯形公式,并结合外推加速公式的Romberg算法。

数值分析-代码

数值分析-代码

注:凡“in.open("C:\\Users\\Administrator\\Desktop\\data-拉格朗日插值.txt")”等里面的路径自己合理修改。

1-1.拉格朗日插值(用一系列已知点求近似函数,并估计未知点的函数值)#include<fstream.h>#include<stdlib.h>int n; //插值节点个数double *X,*Y;//插值节点数组double x;//估计点void read(){double temp;ifstream in;in.open("C:\\Users\\Administrator\\Desktop\\data-拉格朗日插值.txt");if(!in){cout<<"can not open the file !"<<endl;exit(0);}in>>n;X=new double[n];Y=new double[n];for(int i=0;i<n;i++){in>>temp;X[i]=temp;cout<<temp<<" ";in>>temp;Y[i]=temp;cout<<temp<<"\n";}in>>temp;x=temp;cout<<"x="<<temp<<endl;in.close();}void main(){double t,y=0;read();for(int k=0;k<n;k++){t=1;for(int i=0;i<n;i++)if(k!=i)t=(x-X[i])/(X[k]-X[i])*t;y=y+t*Y[k];}cout<<"y="<<y<<endl;}1-2.埃特金逐步插值法(同上)#include<fstream.h>#include<stdlib.h>double *X,*Y; //插值节点(x,y)double x; //带估点int n; //N个插值点,插n-1次。

数值分析全代码

数值分析全代码
double m[20][20],x[20],a[3][3]={1,1,1,1,3,-2,2,-2,1},b[3]={6,1,1},sum;
for(k=0;k<=n-2;k++)
{
for(i=k+1;i<=n-1;i++)
{
m[i][k]=a[i][k]/a[k][k];
for(j=k+1;j<=n-1;j++)
{
for(i=0;i<n;i++)
{sum=0;
max=0;
for(j=0;j<n;j++)
{
if(i!=j)
sum=sum+a[i][j]*x[j];
}
y[i]=(b[i]-sum)/a[i][i];
c=fabs(x[i]-y[i]);
if(c>max)
max=c;
}
if(max<eps)
{printf("k=%d\n",k);
#include<math.h>
#define eps 0.0001
void main()
{
int n=3,i,j,k,n0=100;
double a[3][3]={10,-1,0,-1,10,-2,0,-2,5},b[3]={9,-5,12},t,x[3],y[3],sum=0.0,e=0.0;
for(i=0;i<n;i++)
{
sum=sum+a[i][j]*x[j];
}
x[i]=(b[i]-sum)/a[i][i];
printf("%f\n",x[i]);

数值分析课程设计课程设计

数值分析课程设计课程设计

数值分析课程设计一、课程设计目的和意义数值分析课程设计是通过选择数值分析中的一些基础算法,设计并编写计算机程序来解决实际的算法问题。

课程设计有助于学生更好地理解和掌握数值分析的基础理论知识,同时对于提高学生的编程能力以及培养学生解决实际问题的能力都具有很大的意义。

二、课程设计内容1.矩阵求解矩阵运算是数值分析中的一项基础知识,但学生在初学阶段往往会遇到矩阵运算方面的问题。

因此,在本课程的矩阵求解部分,学生将会学会如何利用数值分析算法对矩阵进行求解。

2.牛顿迭代法牛顿迭代法是数值分析中常用的一种迭代算法,它可以用来求解函数的根。

在课程设计的牛顿迭代法部分,学生将会深入学习该算法的理论知识,并通过编程实践来深化对其的理解。

3.插值和拟合对于实际问题中的数据,我们需要通过插值和拟合等方法来求取相关的函数。

因此,在课程设计的插值和拟合部分,学生将会学习到常用的插值和拟合算法,并通过实现相应的程序来加深对该算法的理解。

4.数值微积分数值微积分是数值分析中的一项基础知识,它是计算机科学中的一个重要组成部分。

在课程设计的数值微积分部分,学生将会在学习理论知识的基础上,通过编写相应的程序来巩固和加深对该算法的理解。

三、课程设计流程1.熟悉课程设计要求在开始课程设计之前,学生应该熟悉课程设计的要求和流程,明确自己需要完成的任务,并制定相应的计划。

2.确定课程设计题目根据课程设计的要求和个人兴趣,学生可以选择一些自己感兴趣的题目,并请教老师和同学进行相关意见的讨论和确认。

3.学习相关理论知识学生在开始进行课程设计之前,需要对所选择的算法进行深入的学习,并完成必要的理论知识的掌握。

4.开始进行编程在掌握相关的理论知识之后,学生开始进行计算机程序的编写,并不断尝试改进和优化。

5.进行结果验证在完成计算机程序的编写之后,学生需要对其进行一定程度的结果验证,并分析测试结果。

6.撰写课程设计报告在完成验证工作之后,学生需要根据要求撰写课程设计报告,并逐步改进报告的质量和便于理解程度。

《数值分析》课程设计

《数值分析》课程设计

问题的提出3.3 用SOR 方法解下列方程组(去松弛因子w=1.2),要求14||||10k k X X +-∞-<。

12142145x x x x +=⎧⎨-=⎩ 3.4 设 411011A ⎛⎫= ⎪⎝⎭,计算()cond A ∞。

3.5 用选列主元Gauss 消元法求解方程组12312312334721320x x x x x x x x x -+=⎧⎪-+-=-⎨⎪-+=⎩3.6 用追赶法解三对角方程组12345210001121000012100001210000120x x x x x -⎛⎫⎛⎫⎛⎫ ⎪ ⎪ ⎪-- ⎪ ⎪ ⎪⎪ ⎪ ⎪=-- ⎪ ⎪ ⎪-- ⎪ ⎪ ⎪ ⎪ ⎪ ⎪-⎝⎭⎝⎭⎝⎭ 3.7 用三角分解法解方程组123248541816862207x x x -⎛⎫⎛⎫⎛⎫ ⎪⎪ ⎪--= ⎪⎪ ⎪ ⎪⎪ ⎪--⎝⎭⎝⎭⎝⎭3.8 用选主元消元法计算下列行列式126324951。

一、问题分析1. 超松弛法是迭代方法的一种加速方法,其计算公式简单,但需要选择合适的松弛因子,以保证迭代过程有较快的收敛速度。

2. A 的条件数计算首先要获得A 的逆,而求A 的逆可以转化为求n 个方程组。

3. 完全主元消元法在计算过程中花费了大量的时间用于寻找主元。

同时,各变量的位置在消元过程中也可能会发生变化。

而列选主元法则可消除这个弊病。

4. 追赶法主要是解三对角方程组。

所谓追指消元过程,赶指回代过程。

5. Gauss 消元法是通过逐步消元过程,将方程组的系数矩阵A 转变为一个上三角矩阵。

三角分解法,就是把系数矩阵分解为两个三角阵。

6.将某一向量坐标同乘以某非零实数,加到另一向量上,行列式的值不变。

用选主元法将行列式矩阵变为三角阵,对角线上的数值相乘即为行列式的值。

二、编程解决3.3Sor法c语言编程:#include<stdio.h>#include<math.h>#include<stdlib.h>#define omega 1.2 //取值不合适结果可能发散void main(){double a[5][5];double b[5],x[5],f,t,y[5]={0,0,0,0,0};int i,j,n,cnt=0;printf("阶数:");scanf("%d",&n);printf("请输入%d阶的A矩阵\n",n);for(i=0;i<n;i++)for(j=0;j<n;j++)scanf("%lf",&a[i][j]);printf("请输入B矩阵\n");for(i=0;i<n;i++)scanf("%lf",&b[i]);printf("count\t");for(i=0;i<n;i++)printf("x[%d]\t\t",i);printf("收敛程度\n");do{for(i=0;i<n;i++)x[i]=y[i];for(i=0;i<n;i++){t=0;for(j=0;j<n;j++)t=t+a[i][j]*(j<i?y[j]:x[j]);y[i]=x[i]+omega*(b[i]-t)/a[i][i];printf("%d",cnt++);for(i=0;i<n;i++)printf("\t%lf",x[i]);f=0;for(i=0;i<n;i++)f+=fabs(y[i]-x[i]);printf("\t%g\n",f);}while(f>1e-4 && cnt<100);}所得结果:3.4 求逆、算条件数编程:#include <stdio.h>#include <math.h>#include <stdlib.h>#define N 5 //可修改,以改变可解决的最大维数。

(完整word版)数值分析课程设计

(完整word版)数值分析课程设计

实验1.1水手、猴子和椰子问题:五个水手带了一只猴子来到南太平洋的一个荒岛上,发现那里有一大堆椰子。

由于旅途的颠簸,大家都很疲惫,很快就入睡了。

第一个水手醒来后,把椰子平分成五堆,将多余的一只给了猴子,他私藏了一堆后便又去睡了。

第二、第三、第四、第五个水手也陆续起来,和第一个水手一样,把椰子分成五堆,恰多一只给猴子,私藏一堆,再去入睡,天亮以后,大家把余下的椰子重新等分成五堆,每人分一堆,正好余一只再给猴子,试问原先共有几只椰子?算法分析:求解这一问题可以用迭代递推算法。

首先分析椰子数目的变化规律,设最初的椰子数为p 0,即第一个水手所处理之前的椰子数,用p 1、p 2、p 3、p 4、p 5 分别表示五个水手对椰子动了手脚以后剩余的椰子数目,则根据问题有4(1)15p p k k =-+, (k=0,1,2,3,4) 再用x 表示最后每个水手平分得到的椰子数,于是有51x (1)5p =-所以515x p =+利用逆向递推的方法,有k 151, (4,3,2,1,0)4k k p p +=+= 有了逆向递推关系式,求解这一问题似乎很简单,但由于椰子数为一正整数,用任意的x 作为初值递推出的p 0数据不一定是合适的。

这里用 for 循环语句结合 break 语句来寻找合适的 x 和 p 0 ,对任意的 x 递推计算出p 0 ,当计算结果为正整数时,结果正确,否则选取另外的 x 再次重新递推计算,直到计算出的结果 p 0 为正整数为止。

MATLAB 编程代码:(1) n=input('输出n 的值:');for x=1:np=5*x+1;for k=1:5p=5*p/4+1;endif p==fix(p)breakendenddisp([x,p])输出结果:输出n的值:1500102315621(2)for x=1:infp=5*x+1;for k=1:5p=5*p/4+1;endif p==fix(p)breakendenddisp([x,p])输出结果:102315621C语言编程代码:#include <stdio.h>int count(int);void main(){int i, n, y;printf( "输入水手数:\n ");scanf( "%d ",&n);y=count(n);for(i=0;i <n;i++){printf( "%d\n ",y);y=(y-1)/5*4;}}int count(int a){int m,i,k=1,ok=0;for(i=1;;){if(i==1)m=k;if((k*5+1)%4==0){k=(k*5+1)/4;i++;}else{k=++m;i=1;}if(i==a&&ok <4){ok++;k=++m;i=1;}if(i==a&&ok==4)break;}return(k*5+1);}实验1.3 绘制Koch分形曲线问题描述:从一条直线段开始,将线段中间的三分之一部分用一个等边三角形的另两条边代替,形成具有5个结点的新的图形(图1);在新的图形中,又将图中每一直线段中间的三分之一部分都用一个等边三角形的另两条边代替,再次形成新的图形(图2),这时,图形中共有17个结点。

《数值分析课程设计》课程教学大纲(本科)

《数值分析课程设计》课程教学大纲(本科)

《数值分析课程设计》教学大纲课程编号:sx080课程名称:数值分析英文名称:Numerical Analysis课程类型:实践教学课程要求:必修学时/学分:1周/I开课学期:4适用专业:数学与应用数学授课语言:中文课程网站:超星泛雅平台一、课程设计性质与任务数值分析课程设计是一门借助计算机实现数值计算方法设计的课程。

通过数值算法基本理论和实现能力的训练,具有利用计算机实现算法的能力,具有分析和优化算法能力;通过查找文献熟悉科学与工程计算问题中的领先的数值算法理论,形成自主学习以及独立设计和运用数值算法解决实际问题的能力。

二、课程设计与其他课程或教学环节的联系先修课程:《数值分析》,《C语言程序设计》后续课程:《数学模型》、《微分方程数值解法》联系:《数值分析》是数值分析课程设计的理论基础,《C语言程序设计》是数值分析课程设计实现工具之一。

数值分析课程设计为《微分方程数值解》的算法实现提供算法基础,为《数学模型》中数学问题的求解提供了一种重要的实现手段。

三、课程设计教学目标1 .通过应用C语言、Matlab等计算机语言,使学生具有编程实现数值算法并解决实际问题的能力;(支撑毕业要求指标点5.1)2.通过基本算法原理的学习与实现,具有优化算法和根据具体问题改进算法的能力;(支撑毕业要求指标点3.3)3.通过查阅资料和应用数值算法解决实际科学问题,形成学生的自主学习意识和有效的学习方法。

(支撑毕业要求指标点12.1)四、教学内容、基本要求与学时分配课程思政元素案例解析:1 .崇尚科学,敢于创新通过从牛顿法到其变形方法这样一个循序渐进的算法改进过程,来向学生阐释什么叫科学研究无止境,从而培养学生的永不满足的科学精神,激发学生努力学习,掌握好知识,敢于创新的精神。

2.热爱祖国,奋发图强在讲授数值积分的梯形公式和辛普森公式时,将会给同学们介绍华罗庚先生写的一本书——《数值积分及其应用》,突出介绍华罗庚先生与王元教授合作在数值积分方法与应用等的研究成果,并同时介绍了华罗庚先生的生平事迹,特别是他放弃美国优越生活条件和良好的科研环境,克服重重困难回到祖国怀抱,投身我国数学科研事业,为中国数学事业发展做出了杰出的贡献,被誉为“人民的数学家”,激发学生的爱国热情。

(完整word版)数值分析课程设计含代码

(完整word版)数值分析课程设计含代码

课程设计任务书摘要实验方法与理论方法是推动科学技术发展的两大基本方法,但有局限性。

许多研究对象,由于空间或时间的限制,既不可能用理论精确描述,也不能用实验手段实现。

数值模拟或称为科学计算突破了实验和理论科学的局限,在科技发展中起到越来越重要的作用。

可以认为,科学计算已于实验、理论一起成为科学方法上不可或缺的三个主要手段。

计算数学的研究是科学计算的主要组成部分,而数值分析则是计算数学的核心。

数值计算是研究使用计算机来解决各种数学问题的近似计算方法与理论,其任务是提供在计算机上可解的、理论可靠的、计算复杂性低的各种常用算法.数值分析的主要内容:1)、数值代数:求解线性和非线性方程组的解,分直接方法和间接方法两大类;2)、插值、曲线拟合和数值逼近;3)、数值微分和数值积分;4)、常微分和偏微分方程数值解法.本文主要通过Matlab软件,对数值分析中的一些问题进行求解,如列主元Gauss消去法,Lagrange插值多项式,复化Simpson公式,Runge-Kutta方法以及数值分析在实际问题中的应用,并在求解的过程中更加熟识这门课程的主要内容,以及加强对课程知识的掌握。

在学习与设计计算方法时,从数学理论角度,学会分析方法的误差、收敛性和稳定性,保证计算方法的准确性;从实际应用的角度出发,掌握计算方法的结构与流程,能够把计算方法转换为可在计算机上直接处理的程序,保证算法的可用性。

关键词:列主元Gauss消去法;Lagrange插值;复化Simpson公式;Runge—Kutta目录实验一列主元Gauss消去法 01。

1 实验目的 01。

2 基本原理 01。

3 实验内容 (1)1。

4 实验结论 (2)实验二拉格朗日插值多项式 (3)2。

1 实验目的 (3)2.2 基本原理 (3)2.3 实验内容 (3)2.4 实验结论 (8)实验三复化Simpson求积公式 (9)3.1 实验目的 (9)3。

2 基本原理 (9)3。

数值分析龙贝格算法

数值分析龙贝格算法

《数值分析》课程设计报告龙贝格算法专业:班级:学号:姓名:1.实验目的运用龙贝格求积公式,编制龙贝格算法程序,计算积分dxx⎰-21211的近似值,要求误差小于106-。

2.程序流程图<== ≠开始输入a,b,eb-a->h,h/2[f(a)+f(b)]->T1,1->k0->s,a+h/2->xs+f(x)->s x+h->x x<b 1/2T1+h/2s->T2 T2+1/3(T2-T1)->S2k=1k+1->k,h/2->h T2->T1,S2->S1S2+1/15(S2-S1)->C2k=2 C2->C1 C2+1/63(C2-C1)->R23. 程序代码#include "stdio.h" #include "math.h" int main(void) {float f(float); float a,b,e,h,T1=0,T2=0,S1=0,S2=0,C1=0,C2=0,R1=0,R2=0,k,s,x; int i=0;printf("请输入积分的下限:"); scanf("%f",&a); printf("\n 请输入积分的上限:"); scanf("%f",&b); printf("\n 请输入允许误差:"); scanf("%f",&e); k=1; h=b-a;T1=h*(f(a)+f(b))/2;printf("----------------------\n"); printf("k T2 S2 C2 R2\n"); printf("%d %10.7f %10.7f %10.7f %10.7f\n",i,T1,S1,C1,R1); do {s=0; x=a+h/2; while(x<b) { s+=f(x); x+=h; } T2=T1/2+s*h/2; S2=T2+(T2-T1)/3; if (k==1) { k=k+1; h=h/2;k=3 |R2-R1|<e 输出a,b,R2结束 R2->R1T1=T2;S1=S2;}else if (k==2){C2=S2+(S2-S1)/15;C1=C2;k=k+1;h=h/2;T1=T2;S1=S2;}else if (k==3){R2=C2+(C2-C1)/63;C2=S2+(S2-S1)/15;C1=C2;k=k+1;h=h/2;T1=T2;S1=S2;}else{C2=S2+(S2-S1)/15;R2=C2+(C2-C1)/63;if (fabs(R2-R1)<e){printf("%d %10.7f %10.7f %10.7f %10.7f\n",i+1,T2,S2,C2,R2);break;}else{R1=R2;C1=C2;k=k+1;h=h/2;T1=T2;S1=S2;}}i++;printf("%d %10.7f %10.7f %10.7f %10.7f\n",i,T2,S2,C2,R2);}while (1);return 0;}float f(float x){/*float y=0;if(x==0.0)return 1;y=(float)sin(x)/(x);return y;*/float y;y=1/(sqrt(1-x*x));return y;}4 运行结果。

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

课程设计任务书实验方法与理论方法是推动科学技术发展的两大基本方法,但有局限性。

许多研究对象,由于空间或时间的限制,既不可能用理论精确描述,也不能用实验手段实现。

数值模拟或称为科学计算突破了实验和理论科学的局限,在科技发展中起到越来越重要的作用。

可以认为,科学计算已于实验、理论一起成为科学方法上不可或缺的三个主要手段。

计算数学的研究是科学计算的主要组成部分,而数值分析则是计算数学的核心。

数值计算是研究使用计算机来解决各种数学问题的近似计算方法与理论,其任务是提供在计算机上可解的、理论可靠的、计算复杂性低的各种常用算法。

数值分析的主要内容:1)、数值代数:求解线性和非线性方程组的解,分直接方法和间接方法两大类;2)、插值、曲线拟合和数值逼近;3)、数值微分和数值积分;4)、常微分和偏微分方程数值解法。

本文主要通过Matlab软件,对数值分析中的一些问题进行求解,如列主元Gauss消去法,Lagrange插值多项式,复化Simpson公式,Runge-Kutta方法以及数值分析在实际问题中的应用,并在求解的过程中更加熟识这门课程的主要内容,以及加强对课程知识的掌握。

在学习与设计计算方法时,从数学理论角度,学会分析方法的误差、收敛性和稳定性,保证计算方法的准确性;从实际应用的角度出发,掌握计算方法的结构与流程,能够把计算方法转换为可在计算机上直接处理的程序,保证算法的可用性。

关键词:列主元Gauss消去法;Lagrange插值;复化Simpson公式;Runge-Kutta实验一列主元Gauss消去法 (1)1.1 实验目的 (1)1.2 基本原理 (1)1.3 实验内容 (2)1.4 实验结论 (3)实验二拉格朗日插值多项式 (4)2.1 实验目的 (4)2.2 基本原理 (4)2.3 实验内容 (4)2.4 实验结论 (9)实验三复化Simpson求积公式 (10)3.1 实验目的 (10)3.2 基本原理 (10)3.3 实验内容 (10)3.4 实验结论 (12)实验四龙格-库塔(Runge-Kutta)方法 (13)4.1 实验目的 (13)4.2 基本原理 (13)4.3 实验内容 (14)4.4 实验结论 (15)实验五数值方法实际应用 (16)5.1 实验目的 (16)5.2 基本原理 (16)5.3 实验内容 (16)5.4 实验结论 (22)参考文献 (23)实验一 列主元Gauss 消去法1.1 实验目的1) 理解列主元消去法的原理;2) 熟悉列主元消去法的计算步骤,能用代码编写; 3) 解决实际问题。

1.2 基本原理在顺序Gauss 消去法中,必须要求),,2,1(0a (k )n k kk =≠;否则无法进行计算。

即使0)(≠k kk a ,但其绝对值)(k kka 很小,由于舍入误差的影响,也可能会引起很大的误差,从而使上述方法失效。

为了使消元过程中减小舍入误差和不至于中断,可以按照不同的自然顺序进行消元。

在第k 步消元时,增广矩阵为[]⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡=-----------)()()1(1)2(2)1(1)()()()()1(1)1(1)1(11)2(2)2(2)2(12)2(22)1(1)1(1)1(11)1(12)1(11)()(k nk k k k k nnk nk k knk kk k nk k kk k k k n k k nk k k k b b b b b a a a a a a a a a a a a a a a a B A(1.1)不一定选取)1(-k kk a 作为主元,而从同列)1()1(,1)1(,,,--+-k nkk k k k kk a a a 中选取绝对值最大的作为主元素,即)1()1(r m a x -≤≤-=k ik ni k k ka a (1.2) 若0)(=k rk a ,此时矩阵不可逆,方程的解不确定,则停止计算;否则,当r>k时,则其增广矩阵中交换第k 行和第r 行,即n k k j a k rj k kj ,,1,a )()( +=↔ )()(k r k k b b ↔ (1.3) 使)(k rk a 成为主元。

然后再按Gauss 消去法进行消元运算。

于是就得到列主元Gauss消去法。

1.3 实验内容1.3.1 程序来源首先建立一个gaussMethod.m的文件,用来实现列主元的消去方法。

文件内容如下:function x=gaussMethod(A,b)%高斯列主元消去法,要求系数矩阵非奇异的n = size(A,1);if abs(det(A))<= 1e-8error('系数矩阵是奇异的'); return;endfor k=1:nak = max(abs(A(k:n,k)));index = find(A(:,k)==ak);if length(index) == 0index = find(A(:,k)==-ak);end%交换列主元temp = A(index,:);A(index,:) = A(k,:);A(k,:) = temp;temp = b(index);b(index) = b(k); b(k) = temp; %消元过程for i=k+1:nm=A(i,k)/A(k,k); %消除列元素A(i,k+1:n)=A(i,k+1:n)-m*A(k,k+1:n);b(i)=b(i)-m*b(k);endend %回代过程x(n)=b(n)/A(n,n);for k=n-1:-1:1;x(k)=(b(k)-A(k,k+1:n)*x(k+1:n)')/A(k,k); end; end然后调用gaussMethod 函数,来实现列主元的高斯消去法。

建立一个文件gauss ,内容如下:cleardisp('**********************************************') x=gaussMethod(input('请输入系数矩阵:'),input('请输入常数列:')) disp('**********************************************')1.3.2 实例分析例:在Matlab 上,利用列主元法求线性方程组的解:⎪⎪⎩⎪⎪⎨⎧=+++-=+++=+++=+++62332022428340213424321432143214321x x x x x x x x x x x x x x x x 解:运行程序,按照提示输入方程的系数矩阵及常数列,如下所示:********************************************** 请输入系数矩阵:[1 2 1 4;2 0 4 3;4 2 2 1;-3 1 3 2] 请输入常数列:[13;28;20;6] x =3 -14 2********************************************** 即该方程的解为:[]2,4,1,3-=x1.4 实验结论把向量计算得到的解带入方程组,验证正确性,和其他的方法比较,列主元具有一定的简单性,比较容易实现。

避免使用其他方法的误差或不能进行性。

而列主元也有一定的限制,要求行列式的值不为0。

实验二 拉格朗日插值多项式2.1 实验目的1)熟悉简单的拉格朗日插值多项式的基本概念;2)熟悉Lagrange 公式及源代码,会利用它来计算基本函数; 3)能构造出正确的插值多项式;2.2 基本原理设函数)(x f y =在区间[a,b]上有定义,且已知在点b x x x x a n ≤<<<≤ 10上的值,,,,10n y y y 若存在一个次数不超过n 的多项式n n n x a x a a x L +++= 10)( (2.1) 使其满足n k y x L k k n ,,1,0,)( == (2.2)则称)(x L n 为)(x f 的n 次插值多项式,称点),,1,0(x n k k =为插值节点,称条件(2.2)为插值条件。

包含插值节点的区间成为插值区间。

通过平面上不同的两点可以确定一条直线经过这两点,就是拉格朗日线性插值问题,对于不在同一直线的三点得到的插值多项式为抛物线。

拉格朗日是比较基础的方法,本身比较容易实现,容易理解。

给定n+1个不同节点,构造[]i x x x x f ,,,,210 的n 次拉格朗日插值多项式: ∑==n x l y x 0i ii )()(L ,1,,2,1,)()()(11+=--=∏+≠=n i x xx x x l n ij j j ij i(2.3)2.3 实验内容2.3.1 程序来源首先建立一个Lagrange.m 的文件,用来实现Lagrange 插值。

文件内容如下: %输入:x 是插值节点横坐标向量;y 是插值节点对应纵坐标向量 %输出:C 是拉格朗日插值多项式的系数矩阵;L 是插值函数系数矩阵function[C,L]=Lagrange(x,y)w=length(x);n=w-1;L=zeros(w,w);for k=1:n+1V=1;for j=1:n+1if k~=jV=conv(V,poly(x(j)))/(x(k)-x(j));endendL(k,:)=V;endC=y*L然后调用Lagrange函数,来实现Lagrange插值法。

建立一个文件Lg,内容如下:cleardisp('**********************************************')x=input('请输入已知点的横坐标组:');y=input('请输入已知点的纵坐标:');[C,L]=Lagrange(x,y);yi=polyval(C,input('请输入需要计算得横坐标组:'))xx=1.5:0.05:6.5;yy=polyval(C,xx);plot(xx,yy,x,y,'o')disp('**********************************************')2.3.2 实例分析例1 有4对数据(1.6,3.3),(2.7,4.22),(3.9,5.61),(5.6,2.94),写出这4个数据点的Lagrange插值公式,并计算出横坐标组xi=[2.101,4.234]时对应的纵坐标值。

解:4个数据点的Lagrange 插值公式为:)9.36.1(*)7.26.5(*)6.16.5()9.3(*)7.2(*)6.1(*94.2)6.59.3(*)7.29.3(*)6.19.3()6.5(*)7.2(*)6.1(*9.3)6.57.2(*)9.37.2(*)6.17.2()6.5(*)9.3(*)6.1(*22.4)6.56.1(*)9.36.1(*)7.26.1()6.5(*)9.3(*)7.2(*3.3x L 3------+------+------+------=x x x x x x x x x x x x )( 运行程序,按照提示输入已知点的横坐标组、纵坐标组及需要计算得横坐标组,如下所示:********************************************** 请输入已知点的横坐标组:[1.6,2.7,3.9,5.6] 请输入已知点的纵坐标:[3.3,1.22,5.61,2.94] C =-1.0539 11.0551 -34.4933 34.5053 请输入需要计算得横坐标组:[2.101,4.234] yi =1.0596 6.6457********************************************** 即 5053344933340551110539123.x .-x .x .-y ++= 输出图形:图2.1 输出拟合曲线例2 将区间[-5,5]等分5份、10份,求函数211xy +=拉格朗日差值多项式,做出函数原图像,观察龙格现象。

相关文档
最新文档