数值计算方法上机实验报告

合集下载

西南交通大学数值分析上机实验报告

西南交通大学数值分析上机实验报告

数值分析上机实习报告学号:姓名:专业:联系电话:任课教师:序 (3)一、必做题 (4)1、问题一 (4)1.1 问题重述 (4)1.2 实验方法介绍 (4)1.3 实验结果 (5)2、问题二 (7)2.1 问题重述 (7)2.2 实验原理 (7)雅各比算法:将系数矩阵A分解为:A=L+U+D,则推到的最后迭代公式为: (8)2.3 实验结果 (8)二、选做题 (10)3、问题三 (10)3.1 问题重述 (10)3.2 实验原理 (10)3.3 实验结果 (11)总结 (11)序伴随着计算机技术的飞速发展,所有的学科都走向定量化和准确化,从而产生了一系列的计算性的学科分支,而数值计算方法就是解决计算问题的桥梁和工具。

数值计算方法,是一种研究并解决数学问题的数值近似解方法,是在计算机上使用的解数学问题的方法。

为了提高计算能力,需要结合计算能力与计算效率,因此,用来解决数值计算的软件因为高效率的计算凸显的十分重要。

数值方法是用来解决数值问题的计算公式,而数值方法的有效性需要根据其方法本身的好坏以及数值本身的好坏来综合判断。

数值计算方法计算的结果大多数都是近似值,但是理论的严密性又要求我们不仅要掌握将基本的算法,还要了解必要的误差分析,以验证计算结果的可靠性。

数值计算一般涉及的计算对象是微积分,线性代数,常微分方程中的数学问题,从而对应解决实际中的工程技术问题。

在借助MA TLAB、JA V A、C++ 和VB软件解决数学模型求解过程中,可以极大的提高计算效率。

本实验采用的是MATLAB软件来解决数值计算问题。

MA TLAB是一种用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,其对解决矩阵运算、绘制函数/数据图像等有非常高的效率。

本文采用MATLAB对多项式拟合、雅雅格比法与高斯-赛德尔迭代法求解方程组迭代求解,对Runge-Kutta 4阶算法进行编程,并通过实例求解验证了其可行性,使用不同方法对计算进行比较,得出不同方法的收敛性与迭代次数的多少,比较各种方法的精确度和解的收敛速度。

数值代数上机实验报告

数值代数上机实验报告

数值代数上机实验报告试验项目名称:平方根法与改进平方根法实验内容:先用你熟悉的计算机语言将平方根法和改进平方根法编写成通用的子程序,然后用你编写的程序求解对称正定方程组Ax=b,其中,A=[101 10 1…1 10 11 10]100*100b随机生成,比较计算结果,评论方法优劣。

实验要求:平方根法与改进的平方根的解法步骤;存储单元,变量名称说明;系数矩阵与右端项的生成;结果分析。

实验报告姓名:罗胜利班级:信息与计算科学0802 学号:u200810087 实验一、平方根法与改进平方根法先用你所熟悉的计算机语言将平方根法和改进的平方根法编成通用的子程序,然后用你编写的程序求解对称正定方程组AX=b,其中系数矩阵为40阶Hilbert矩阵,即系数矩阵A的第i行第j列元素为=,向量b的第i个分量为=.平方根法函数程序如下:function [x,b]=pingfanggenfa(A,b)n=size(A);n=n(1);x=A^-1*b; %矩阵求解disp('Matlab自带解即为x');for k=1:nA(k,k)=sqrt(A(k,k));A(k+1:n,k)=A(k+1:n,k)/A(k,k);for j=k+1:n;A(j:n,j)=A(j:n,j)-A(j:n,k)*A(j,k);endend %Cholesky分解for j=1:n-1b(j)=b(j)/A(j,j);b(j+1:n)=b(j+1:n)-b(j)*A(j+1:n,j);endb(n)=b(n)/A(n,n); %前代法A=A';for j=n:-1:2b(j)=b(j)/A(j,j);b(1:j-1)=b(1:j-1)-b(j)*A(1:j-1,j);endb(1)=b(1)/A(1,1); %回代法disp('平方根法的解即为b');endfunction [x]=ave(A,b,n) %用改进平方根法求解Ax=b L=zeros(n,n); %L为n*n矩阵D=diag(n,0); %D为n*n的主对角矩阵S=L*D;for i=1:n %L的主对角元素均为1L(i,i)=1;for i=1:nfor j=1:n %验证A是否为对称正定矩阵if (eig(A)<=0)|(A(i,j)~=A(j,i)) %A的特征值小于0或A非对称时,输出wrong disp('wrong');break;endendendD(1,1)=A(1,1); %将A分解使得A=LDL Tfor i=2:nfor j=1:i-1S(i,j)=A(i,j)-sum(S(i,1:j-1)*L(j,1:j-1)');L(i,1:i-1)=S(i,1:i-1)/D(1:i-1,1:i-1);endD(i,i)=A(i,i)-sum(S(i,1:i-1)*L(i,1:i-1)');endy=zeros(n,1); % x,y为n*1阶矩阵x=zeros(n,1);for i=1:ny(i)=(b(i)-sum(L(i,1:i-1)*D(1:i-1,1:i-1)*y(1:i-1)))/D(i,i); %通过LDy=b解得y的值endfor i=n:-1:1x(i)=y(i)-sum(L(i+1:n,i)'*x(i+1:n)); %通过L T x=y解得x的值改进平方根法函数程序如下:function b=gaijinpinfanggenfa(A,b)n=size(A);n=n(1);v=zeros(n,1);for j=1:nfor i=1:j-1v(i)=A(j,i)*A(i,i);endA(j,j)=A(j,j)-A(j,1:j-1)*v(1:j-1);A(j+1:n,j)=(A(j+1:n,j)-A(j+1:n,1:j-1)*v(1:j-1))/A(j,j);end %LDL'分解B=diag(A);D=zeros(n);for i=1:nD(i,i)=B(i);A(i,i)=1;EndA=tril(A); %得到L和Dfor j=1:n-1b(j)=b(j)/A(j,j);b(j+1:n)=b(j+1:n)-b(j)*A(j+1:n,j);endb(n)=b(n)/A(n,n); %前代法A=D*(A');for j=n:-1:2b(j)=b(j)/A(j,j);b(1:j-1)=b(1:j-1)-b(j)*A(1:j-1,j);endb(1)=b(1)/A(1,1); %回代法disp('改进平方根法解得的解即为b');end调用函数解题:clear;clc;n=input('请输入矩阵维数:');b=zeros(n,1);A=zeros(n);for i=1:nfor j=1:nA(i,j)=1/(i+j-1);b(i)=b(i)+1/(i+j-1);endend %生成hilbert矩阵[x,b]=pingfanggenfa(A,b) b=gaijinpinfanggenfa(A,b)运行结果:请输入矩阵维数:40Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = 6.570692e-020. > In pingfanggenfa at 4In qiujie at 10Matlab自带解即为x平方根法的解即为bx =1.60358.96850.85621.01950.9375-50.2500-3.0000-16.000024.0000-49.5000-30.000039.000022.0000-64.0000-12.00002.000010.2500-10.5000-1.0000-10.875083.000046.0000-98.0000-69.000068.000021.0000-50.7188-8.7500-8.0000 112.0000 6.0000 -68.7500 22.000044.0000 -28.0000 8.0000 -44.000012.0000b =1.0e+007 *0.0000-0.00000.0001-0.0004-0.00140.0424-0.29801.1419-2.73354.2539-4.30182.7733-1.19890.5406-0.36880.32850.4621-0.25130.05650.0000-0.00510.0071-0.0027-0.0031-0.00190.00090.0002-0.0002-0.00060.00040.0001-0.00020.00010.0000-0.00000.0000-0.0000-0.0000改进平方根法解得的解即为bb =1.0e+024 *0.0000-0.00000.0001-0.0012-0.0954 0.4208 -1.2101 2.0624 -1.0394 -3.3343 6.2567 -0.2463 -7.45942.80303.6990 0.7277 -1.7484 -0.4854 -3.6010 0.2532 5.1862 1.4410 0.8738 -4.5654 1.0422 4.0920 -2.7764 -2.2148 -0.8953 0.3665 4.8967 1.0416 0.1281-1.1902-2.83348.4610-3.6008实验二、利用QR分解解线性方程组:利用QR分解解线性方程组Ax=b,其中A=[16 4 8 4;4 10 8 4;8 8 12 10;4 4 10 12];b=[32 26 38 30];求解程序如下:定义house函数:function [v,B]=house(x)n=length(x);y=norm(x,inf);x=x/y;Q=x(2:n)'*x(2:n);v(1)=1;v(2:n)=x(2:n);if n==1B=0;elsea=sqrt(x(1)^2+Q);if x(1)<=0v(1)=x(1)-a;elsev(1)=-Q/(x(1)+a);endB=2*v(1)^2/(Q+v(1)^2);endend进行QR分解:clear;clc;A=[16 4 8 4;4 10 8 4;8 8 12 10;4 4 10 12]; b=[32 26 38 30];b=b';x=size(A);m=x(1);n=x(2);d=zeros(n,1);for j=1:n[v,B]=house(A(j:m,j));A(j:m,j:n)=(eye(m-j+1)-B*(v')*v)*A(j:m,j:n); d(j)=B;if j<m< p="">A(j+1:m,j)=v(2:m-j+1);endend %QR分解R=triu(A); %得到R D=A;I=eye(m,n);Q=I;for i=1:nD(i,i)=1;endH=tril(D);M=H';for i=1:nN=I-d(i)*H(1:m,i)*M(i,1:m);Q=Q*N;end %得到Qb=(Q')*b; %Q是正交阵for j=n:-1:2b(j)=b(j)/R(j,j);b(1:j-1)=b(1:j-1)-b(j)*R(1:j-1,j);endb(1)=b(1)/R(1,1); %回带法运行结果如下:R =18.7617 9.8072 15.7769 11.08640 9.9909 9.3358 7.53410 0 5.9945 9.80130 0 0 -0.5126Q =0.8528 -0.4368 -0.2297 -0.17090.2132 0.7916 -0.4594 -0.34170.4264 0.3822 0.2844 0.76890.2132 0.1911 0.8095 -0.5126b=1.000000000000001.000000000000010.9999999999999881.00000000000001实验三、Newton下山法解非线性方程组:3x-cos(yz)-=0,-81+sinz+1.06=0,exp(-xy)+20z+=0;要求满足数值解=满足或.定义所求方程组的函数:Newtonfun.mfunction F = Newtonfun(X)F(1,1)=3*X(1)-cos(X(2)*X(3))-1/2;F(2,1)=X(1)^2-81*(X(2)+0.1)^2+sin(X(3))+1.06;F(3,1)=exp(-X(1)*X(2))+20*X(3)+(10*pi-3)/3;End向量求导:Xiangliangqiudao.mfunction J=xiangliangqiudao()syms x y zX=[x,y,z];F=[3*X(1)-cos(X(2)*X(3))-1/2;X(1)^2-81*(X(2)+0.1)^2+sin(X(3))+1.06;exp(-X(1)*X(2))+20*X(3)+(10*pi-3)/3];J=jacobian(F,[x y z]);End代值函数:Jacobi.mfunction F=Jacobi(x)F=[ 3,x(3)*sin(x(2)*x(3)), x(2)*sin(x(2)*x(3));2*x(1), -162*x(2)-81/5,cos(x(3));-x(2)/exp(x(1)*x(2)),-x(1)/exp(x(1)*x(2)),20];End方程组求解:format long; %数据表示为双精度型X1=[0,0,0]';eps=10^(-8);k=1;i=1;X2=X1-Jacobi(X1)^(-1)*Newtonfun(X1);while (norm(subs(X2-X1,pi,3.1415926),2)>=eps)&&(norm(Newtonfun(X1),2)>=eps) if norm(Newtonfun(X2),2)<="" p="">X1=X2;B=inv(Jacobi(X2));C=Newtonfun(X2);X2=X2-B*C;i=i+1;elsev=1/(2^k); %引入下山因子X1=X2;B=inv(Jacobi(X2));C=Newtonfun(X2);X2=X2-v*B*C;k=k+1;endendj=i+k-1 %迭代次数X=X2 %输出结果运行结果如下:j =5X =0.500000000000000 -0.000000000000000 -0.523598775598299</m<>。

数值分析上机实验报告

数值分析上机实验报告

实验报告一题目: (绪论) 非线性方程求解及误差估计摘要:非线性方程的解析解通常很难给出,因此线性方程的数值解法就尤为重要。

本实验采用两种常见的求解方法二分法、Newton 法和改进的Newton 法。

可以节省计算机的计算时间,还能减小不必要的误差。

前言:(目的和意义)掌握二分法与Newton 法的基本原理、应用以及熟练掌握用MATLAB 求函数积分 数学原理:(1)函数的调用格式:quadl(filename,a,b,tol,trace)其中filename 是调用函数名,a 和b 分别为定积分的下限和上限。

用来控制积分精度。

(2)秦九韶算法: S n =a nS k =xS k+1+a k (k=n-1,n-2,...,0), P n (x)=S 0 程序设计:例1.1 计算积分de x xx110利用MATLAB ,下面给出主程序>>g=inline('x.^10.*exp(x-1)'); %定义一个语句函数g(x)=exp(x^10*exp(x-1)) I=quadl(g,0,1) I =0.0098例1.9 秦九韶算法a 0=3,a k=2a k-1+3,Pn(x)=a n x^n+a n-1x^(n-1)+...+a1x+a0求I1=P100(0.5),I2=P150(13)>>x=input('x=');n=input('n=');a=3;for i=1:na=2*a+3;ends=z;b=(a-3)/2;for m=1:100s=x*s+b;b=(b-3)/2;enddisp(s);>>x=0.5n=100600.0000>>x=3n=1004.7039e+078结果分析和讨论:结论:对于二分法,只要能够保证在给定的区间内有根,使能够收敛的,当时收敛的速度和给定的区间有关,二且总体上来说速度比较慢。

暑期实习报告--数值实验

暑期实习报告--数值实验

2011年暑期实习报告数值实验姓名: GZ 班级:信息与计算科学09-3班学号:一、 实验目的(1) 《数值计算方法》算法的上机实践。

2011年的春季学习,我们学习了《数值计算方法》这门很重要的课程。

要知道课本上的东西不经过消化是不能成为自己的知识的,不讲理论联系实际,那么我们学到的东西是没有任何意义的。

只有真正去试验,去检验才能成为明白其中的道理。

只有经过怀疑、验证、比较才能明白,什么是好用的,什么是实用的。

为了能够使我们更好的掌握和了解数值计算的算法,为了使我们能将学过的知识真正用于将来的编程设计中,学校和学院老师为我们提供了暑期实践这样一个很好的机会,让大家能亲身感受到算法的奥妙,在短时间内有很大的提高。

(2)Mablab 的学习和使用。

我们在认真领悟算法的同时,通过程序的实现过程,很好的了解并且熟练使用Matlab 也是我们实习的一个重要目的。

一种实用的工具如果不经过练习是不可能被熟练的掌握和使用的,我们如果不经过编程实验,就不能体会到Matlab 强的功能和数学计算上的优势。

Matlab 是三大数学软件之一,有强大的数值计算功能,同时有许多实用的工具箱。

要掌握这些必须要我们多加练习,这次实验正给我们提供了一次了解使用Matlab 编程的机会,在实验中体会Matlab 带给我们的方便。

熟练的掌握Matlab 的用法和工具箱是我们信息专业的同学必须具备的条件。

(3)体会实验的意义和重要性。

提高自己在实验中发现问题、解决问题的能力。

实验的过程是是最重要的,在过程中我们不断的提高自己,发展自己,认识不足,弥补不足才会有真正的提高。

我参加了这次实践,获益良多。

二、 实验内容及结果分析实验一:迭代法求方程根的收敛性内容:为了体会在非线性方程求根的迭代法中,迭代函数和初始迭代值的选取对迭代收敛性的影响。

考虑一个简单的代数方程324100x x +-=,针对上述方程,可以构造多种迭代法,如下列几种迭代格式:①321410n n n x x x x +=--++;②13211(10)2n n x x +=-;③12110()4n x x +=+;④321241038n n n n n nx x x x x x ++-=-+。

数值分析2024上机实验报告

数值分析2024上机实验报告

数值分析2024上机实验报告数值分析是计算数学的一个重要分支,它研究如何用数值方法来解决数学问题。

在数值分析的学习过程中,学生需要通过上机实验来巩固理论知识,并学会使用相应的数值方法来解决实际问题。

本篇报告将详细介绍2024年度数值分析上机实验的内容和结果。

一、实验内容2024年度数值分析上机实验分为四个部分,分别是:方程求根、插值与拟合、数值积分和常微分方程的数值解。

1.方程求根这部分实验要求使用数值方法求解给定的非线性方程的根。

常见的数值方法有二分法、牛顿法、割线法等。

在实验过程中,我们需要熟悉这些数值方法的原理和实现步骤,并对不同方法的收敛性进行分析和比较。

2.插值与拟合这部分实验要求使用插值和拟合方法对给定的一组数据进行拟合。

插值方法包括拉格朗日插值、牛顿插值等;拟合方法包括最小二乘拟合、多项式拟合等。

在实验中,我们需要熟悉插值和拟合方法的原理和实现步骤,并对不同方法的精度和稳定性进行比较。

3.数值积分这部分实验要求使用数值方法计算给定函数的积分。

常见的数值积分方法有梯形法则、辛普森法则、龙贝格积分等。

在实验过程中,我们需要熟悉这些数值积分方法的原理和实现步骤,并对不同方法的精度和效率进行比较。

4.常微分方程的数值解这部分实验要求使用数值方法求解给定的常微分方程初值问题。

常见的数值方法有欧拉法、改进的欧拉法、四阶龙格-库塔法等。

在实验中,我们需要熟悉这些数值解方法的原理和实现步骤,并对不同方法的精度和稳定性进行比较。

二、实验结果在完成2024年度数值分析上机实验后,我们得到了以下实验结果:1.方程求根我们实现了二分法、牛顿法和割线法,并对比了它们的收敛速度和稳定性。

结果表明,割线法的收敛速度最快,但在一些情况下可能会出现振荡;二分法和牛顿法的收敛速度相对较慢,但稳定性较好。

2.插值与拟合我们实现了拉格朗日插值和最小二乘拟合,并对比了它们的拟合效果和精度。

结果表明,拉格朗日插值在小区间上拟合效果较好,但在大区间上可能出现振荡;最小二乘拟合在整体上拟合效果较好,但可能出现过拟合。

数值分析上机实习报告

数值分析上机实习报告

指导教师:姓名:学号:专业:联系电话:上海交通大学目录序言 (3)实验课题(一) 雅可比迭代法和高斯-塞得尔迭代法的收敛性和收敛速度 (4)数值分析 (6)实验课题(二) 松弛因子对SOR法收敛速度的影响 (6)数值分析 (12)总结 (13)附录(程序清单) (14)1.雅可比迭代法和高斯-塞得尔迭代法的收敛性和收敛速度 (14)雅可比迭代法: (14)高斯-塞得尔迭代法: (16)2.松弛因子对SOR法收敛速度的影响 (18)松弛法(SOR) (18)序言随着科学技术的发展,提出了大量复杂的数值计算问题,在实际解决这些计算问题的长期过程中,形成了计算方法这门学科,专门研究各种数学问题的数值解法(近似解法),包括方法的构造和求解过程的误差分析,是一门内容丰富,有自身理论体系的实用性很强的学科。

解决工程问题,往往需要处理很多数学模型,这就要花费大量的人力和时间,但是还有不少数学模型无法用解析法得到解。

使用数值方法并利用计算机,就可以克服这些困难。

事实上,科学计算已经与理论分析、科学实验成为平行的研究和解决科技问题的科学手段,经常被科技工作者所采用。

作为科学计算的核心内容——数值分析(数值计算方法),已逐渐成为广大科技工作者必备的基本知识并越来越被人重视。

由于数值方法是解数值问题的系列计算公式,所以数值方法是否有效,不但与方法本身的好坏有关,而且与数值问题本身的好坏也有关,因此,研究数值方法时,不但需要研究数值方法的好坏,即数值稳定性问题,而且还需要研究数值问题本身的好坏,即数值问题的性态,以及它们的判别问题。

数值计算的绝大部分方法都具有近似性,而其理论又具有严密的科学性,方法的近似值正是建立在理论的严密性基础上,根据计算方法的这一特点。

因此不仅要求掌握和使用算法,还要重视必要的误差分析,以保证计算结果的可靠性。

数值计算还具有应用性强的特点,计算方法的绝大部分方法如求微分方程近似解,求积分近似值,求解超越方程,解线性方程组等都具有较强的实用性,而插值法,最小二乘法,样条函数等也都是工程技术领域中常用的,有实际应用价值的方法。

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

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

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

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

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

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

3)写出上机练习报告。

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

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

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

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

计算方法上机实验

计算方法上机实验

1.拉格朗日插值多项式,用于离散数据的拟合#include <stdio.h>#include <conio.h>#include <alloc.h>float lagrange(float *x,float *y,float xx,int n) /*拉格朗日插值算法*/{ int i,j;float *a,yy=0.0; /*a作为临时变量,记录拉格朗日插值多项式*/a=(float *)malloc(n*sizeof(float));for(i=0;i<=n-1;i++){ a[i]=y[i];for(j=0;j<=n-1;j++)if(j!=i) a[i]*=(xx-x[j])/(x[i]-x[j]);yy+=a[i];}free(a);return yy;}main(){ int i,n;float x[20],y[20],xx,yy;printf("Input n:");scanf("%d",&n);if(n>=20) {printf("Error!The value of n must in (0,20)."); getch();return 1;} if(n<=0) {printf("Error! The value of n must in (0,20)."); getch(); return 1;} for(i=0;i<=n-1;i++){ printf("x[%d]:",i);scanf("%f",&x[i]);}printf("\n");for(i=0;i<=n-1;i++){ printf("y[%d]:",i);scanf("%f",&y[i]);}printf("\n");printf("Input xx:");scanf("%f",&xx);yy=lagrange(x,y,xx,n);printf("x=%f,y=%f\n",xx,yy);getch();}2.牛顿插值多项式,用于离散数据的拟合#include <stdio.h>#include <conio.h>#include <alloc.h>void difference(float *x,float *y,int n){ float *f;int k,i;f=(float *)malloc(n*sizeof(float));for(k=1;k<=n;k++){ f[0]=y[k];for(i=0;i<k;i++)f[i+1]=(f[i]-y[i])/(x[k]-x[i]);y[k]=f[k];}return;}main(){ int i,n;float x[20],y[20],xx,yy;printf("Input n:");scanf("%d",&n);if(n>=20) {printf("Error! The value of n must in (0,20)."); getch(); return 1;} if(n<=0) {printf("Error! The value of n must in (0,20).");getch(); return 1;} for(i=0;i<=n-1;i++){ printf("x[%d]:",i);scanf("%f",&x[i]);}printf("\n");for(i=0;i<=n-1;i++){ printf("y[%d]:",i);scanf("%f",&y[i]);}printf("\n");difference(x,(float *)y,n);printf("Input xx:");scanf("%f",&xx);yy=y[20];for(i=n-1;i>=0;i--) yy=yy*(xx-x[i])+y[i];printf("NewtonInter(%f)=%f",xx,yy);getch();}3.高斯列主元消去法,求解其次线性方程组第一种#include<stdio.h>#include <math.h>#define N 20int main(){ int n,i,j,k;int mi,tmp,mx;float a[N][N],b[N],x[N];printf("\nInput n:");scanf("%d",&n);if(n>N){ printf("The input n should in(0,N)!\n");getch();return 1;}if(n<=0){ printf("The input n should in(0,N)!\n");getch();return 1;}printf("Now input a(i,j),i,j=0...%d:\n",n-1); for(i=0;i<n;i++){ for(j=0;j<n;j++)scanf("%f",&a[i][j]);}printf("Now input b(i),i,j=0...%d:\n",n-1);for(i=0;i<n;i++)scanf("%f",&b[i]);for(i=0;i<n-2;i++){ for(j=i+1,mi=i,mx=fabs(a[i][j]);j<n-1;j++) if(fabs(a[j][i])>mx){ mi=j;mx=fabs(a[j][i]);}if(i<mi){ tmp=b[i];b[i]=b[mi];b[mi]=tmp;for(j=i;j<n;j++){ tmp=a[i][j];a[i][j]=a[mi][j];a[mi][j]=tmp;}}for(j=i+1;j<n;j++){ tmp=-a[j][i]/a[i][i];b[j]+=b[i]*tmp;for(k=i;k<n;k++)a[j][k]+=a[i][k]*tmp;}}x[n-1]=b[n-1]/a[n-1][n-1];for(i=n-2;i>=0;i--){ x[i]=b[i];for(j=i+1;j<n;j++)x[i]-=a[i][j]*x[j];x[i]/=a[i][i];}for(i=0;i<n;i++)printf("Answer:\n x[%d]=%f\n",i,x[i]); getch();return 0;}第二种#include<math.h>#include<stdio.h>#define NUMBER 20#define Esc 0x1b#define Enter 0x0dfloat A[NUMBER][NUMBER+1] ,ark;int flag,n;exchange(int r,int k);float max(int k);message();main(){float x[NUMBER];int r,k,i,j;char celect;clrscr();printf("\n\nUse Gauss.");printf("\n\n1.Jie please press Enter."); printf("\n\n2.Exit press Esc.");celect=getch();if(celect==Esc)exit(0);printf("\n\n input n=");scanf("%d",&n);printf(" \n\nInput matrix A and B:"); for(i=1;i<=n;i++){printf("\n\nInput a%d1--a%d%d and b%d:",i,i,n,i);for(j=1;j<=n+1;j++) scanf("%f",&A[i][j]);}for(k=1;k<=n-1;k++){ark=max(k);if(ark==0){printf("\n\nIt's wrong!");message();}else if(flag!=k)exchange(flag,k);for(i=k+1;i<=n;i++)for(j=k+1;j<=n+1;j++)A[i][j]=A[i][j]-A[k][j]*A[i][k]/A[k][k];}x[n]=A[n][n+1]/A[n][n];for( k=n-1;k>=1;k--){float me=0;for(j=k+1;j<=n;j++){me=me+A[k][j]*x[j];}x[k]=(A[k][n+1]-me)/A[k][k];}for(i=1;i<=n;i++){printf(" \n\nx%d=%f",i,x[i]);}message();}exchange(int r,int k){int i;for(i=1;i<=n+1;i++)A[0][i]=A[r][i];for(i=1;i<=n+1;i++)A[r][i]=A[k][i];for(i=1;i<=n+1;i++)A[k][i]=A[0][i];}float max(int k){int i;float temp=0;for(i=k;i<=n;i++)if(fabs(A[i][k])>temp){temp=fabs(A[i][k]);flag=i;}return temp;}message(){printf("\n\n Go on Enter ,Exit press Esc!");switch(getch()){case Enter: main();case Esc: exit(0);default:{printf("\n\nInput error!");message();} }}4.龙贝格求积公式,求解定积分#include<stdio.h>#include<math.h>#define f(x) (sin(x)/x)#define N 20#define MAX 20#define a 2#define b 4#define e 0.00001float LBG(float p,float q,int n){ int i;float sum=0,h=(q-p)/n;for (i=1;i<n;i++)sum+=f(p+i*h);sum+=(f(p)+f(q))/2;return(h*sum);}void main(){ int i;int n=N,m=0;float T[MAX+1][2];T[0][1]=LBG(a,b,n);n*=2;for(m=1;m<MAX;m++){ for(i=0;i<m;i++)T[i][0]=T[i][1];T[0][1]=LBG(a,b,n);n*=2;for(i=1;i<=m;i++)T[i][1]=T[i-1][1]+(T[i-1][1]-T[i-1][0])/(pow(2,2*m)-1);if((T[m-1][1]<T[m][1]+e)&&(T[m-1][1]>T[m][1]-e)){ printf("Answer=%f\n",T[m][1]); getch();return ;}}}5.牛顿迭代公式,求方程的近似解#include<stdio.h>#include<math.h>#include<conio.h>#define N 100#define PS 1e-5#define TA 1e-5float Newton(float (*f)(float),float(*f1)(float),float x0 ) { float x1,d=0;int k=0;do{ x1= x0-f(x0)/f1(x0);if((k++>N)||(fabs(f1(x1))<PS)){ printf("\nFailed!");getch();exit();}d=(fabs(x1)<1?x1-x0:(x1-x0)/x1);x0=x1;printf("x(%d)=%f\n",k,x0);}while((fabs(d))>PS&&fabs(f(x1))>TA) ;return x1;}float f(float x){ return x*x*x+x*x-3*x-3; }float f1(float x){ return 3.0*x*x+2*x-3; }void main(){ float f(float);float f1(float);float x0,y0;printf("Input x0: ");scanf("%f",&x0);printf("x(0)=%f\n",x0);y0=Newton(f,f1,x0);printf("\nThe root is x=%f\n",y0); getch();}。

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

数值计算方法上机实验报告班级:农电0801 姓名:杨 昆学号:200801090122 算法原理以及程序框图①牛顿法求非线性方程● 算法原理:对于非线性方程()0f x =,若已知跟*x 的一个近似值k x ,将()f x 在k x 处展开成一阶泰勒公式:"'2()()()()()()2!k k k k f f x f x f x x x x x ξ=+-+-忽略高次项,有'()()()()k k k f x f x f x x x ≈+-右端是直线方程,用这个直线方程来近似非线性方程()f x 。

将非线性方程()0f x =的根*x 代入*()0f x =,即'*()()()0k k k f x f x x x +-≈解出*'()()k k k f x x x f x ≈-将右端取为1k x +,则1k x +是比k x 更接近于*x 的近似值,即1'()()k k k k f x x x f x +=-这就是牛顿迭代公式。

● 程序框图:●具体算例及求解结果:导出计算(0)c c>的牛顿迭代公式,并计算115。

迭代结果:10.75000010.72383710.723805●输入变量、输出变量说明:输入变量:0x迭代初值,ε迭代精度,N迭代最大次数输出变量:k当前迭代次数,x当前迭代值1②列主元消去法求解线性方程组●算法原理:高斯消去法是利用现行方程组初等变换中的一种变换,即用一个不为零的数乘一个方程后加只另一个方程,使方程组变成同解的上三角方程组,然后再自下而上对上三角方程组求解。

列选住院是当高斯消元到第k 步时,从k 列的kk a 以下(包括kk a )的各元素中选出绝对值最大的,然后通过行交换将其交换到kk a 的位置上。

交换系数矩阵中的两行(包括常数项),只相当于两个方程的位置交换了,因此,列选主元不影响求解的结果。

● 程序框图:● 具体算例及求解结果:用列选主元法求解下列线性方程组1231231232315410030.12x x x x x x x x x ++=⎧⎪++=⎨⎪-+=⎩ 求解结果:1.2000002.000000 -1.400000● 输入变量、输出变量说明:输入变量:ij a 系数矩阵元素,i b 常向量元素 输出变量:12,,n b b b 解向量元素③LU 分解求解线性方程组● 算法原理:求解线性方程组Ax b =时,当对A 进行杜里特尔分解,则等价于求解LUx b =,这时可归结为利用递推计算相继求解两个三角形(系数矩阵为三角矩阵)方程组,用顺代,由Ly b =求出y ,再利用会带,由Ux y =求出x 。

● 程序框图:● 具体算例及求解结果:用杜里特尔分解法求解方程组123223347712457x x x ⎡⎤⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥--⎣⎦⎣⎦⎣⎦ 求解结果:2.000000 -2.000000 1.000000● 输入变量、输出变量说明:输入变量:ij a 系数矩阵元素,i b 常向量元素 输出变量:12,,n b b b 解向量元素④拉格朗日插值多项式● 算法原理:首先构造基函数0()nik i k ii k x x l x x x =≠-=-∏,可以证明基函数满足下列条件:()1k i i k l x i k≠⎧=⎨=⎩,对于给定1n +个节点,n 次拉格朗日插值多项式由下式给出:0()()nk k k L x l x y ==∑其中0()nik i k ii kx x l x x x =≠-=-∏由于()k l x 是一个关于x 的n 次多项式,所以()L x 为关于x 的不高于n 次的代数多项式。

当i x x =时,()i i L x y =,满足插值条件。

● 程序框图:● 具体算例及求解结果:已知()sin f x x = 的值如下表所示。

()sin f x x =的值x0 6π 4π 3π 2π sin x1222321试用四次Lagrange 多项式计算sin 12π的估计值。

求解结果: 0.258588● 输入变量、输出变量说明:输入变量:(,)i i x y 插值节点输出变量:y 插值所得到被插函数在插值点的近似值⑤最小二乘法曲线拟合● 算法原理:对于给定的一组数据(,)i i x y ,i =1,2…,m ,寻求做n 次多项式0nk k k y a x ==∑使性能指标2011(,,,)()mnk n i k i i k J a a a y a x ===-∑∑ 为最小。

由于性能指标J 可以被看做关于k a ,k =0,1,…,n 的多元函数,故上述拟合多项式的构造问题可转化为多元函数的极值问题。

令0kJa ∂=∂ 从而有正则方程组203121122n i iii n i i i i iin n n n n n i i i i ii m x xx y a x y a x x xxa x y x x xx +++⎡⎤⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎣⎦∑∑∑∑∑∑∑∑∑∑∑∑∑∑求解即得多项式系数。

● 程序框图:● 具体算例及求解结果:给定函数()y f x =的实例数据表:i x 1 2 3 4 6 7 8 i y2367532试用最小二乘法求二次拟合多项式 求解结果: -1.318171 3.431811 -0.38636321.318171 3.4318110.386363y x x =-+-● 输入变量、输出变量说明:输入变量:(,)i i x y 已知数据点 输出变量:i a 拟合多项式的系数⑥改进欧拉法求解常微分方程初值问题● 算法原理:当h 取值较小时,让梯形法的迭代公式只迭代一次就结束。

这样先用欧拉公式求得一个初步近似值(0)1n y +,称之为预报值,预报值的精度不高,用它替代梯形法右端的1n y +,再直接计算得出1n y +,并称之为校正值,这时得到预报-校正公式。

将预报-校正公式(0)1(0)111(,)(,)(,)2n n n n n n n n n n y y hf x y h y y f x y f x y ++++⎧=+⎪⎨⎡⎤=++⎪⎣⎦⎩ 称为改进欧拉公式。

● 程序框图:● 具体算例及求解结果:求解初值问题'2,01(0)1x y y x y y ⎧=-<<⎪⎨⎪=⎩求解结果:n xn y()n y xn xn y()n y x0.1 1.095909 1.095909 0.6 1.485956 1.485955 0.2 1.184097 1.184097 0.7 1.562514 1.552514 0.3 1.266201 1.266201 0.8 1.616475 1.616474 0.4 1.343360 1.343360 0.9 1.678320 1.678166 0.5 1.416402 1.416402 1.0 1.737867 1.737867● 输入变量、输出变量说明:输入变量:00(,)x y 处置点,h 区间长度,N 计算次数 输出变量:11(,)x y 初值问题的数值解法结果⑦四阶龙格-库塔法求解常微分方程初值问题算法原理:用区间[]1,k k x x +内四个不同点上的函数值的线性组合就得到四阶龙格-库塔法。

四阶龙格-库塔法1112233441211113221122243311322333()(,)(,)(,)(,)n n n n n n n n n n y y h k k k k k f x y k f x h y k h k f x h y k h k h k f x h y k h k h k h ωωωωλμλμμλμμμ+=++++⎧⎪=⎪⎪=++⎨⎪=+++⎪⎪=++++⎩ 其中,,,ωλμ均为待定系数。

类似于前面的讨论,把234,,k k k 分别在n x 点展开成h 的幂级数,代入1n y +并进行花间,然后与1()n y x +在n x 点上的泰勒展开式比较,使其两式比较,使其两式右端直到4h 的系数相等,经过复杂的数学演算可得到关于,,ωλμ的一组特解121122213132333142312011613λλμμμμμλμωωωω⎧⎪====⎪⎪===⎪⎪==⎨⎪⎪==⎪⎪==⎪⎩从而得到下列常用的经典公式11234121123122413(22)6(,)(,)2(,)2(,)n n n n nn nn n n hy y k k k k k f x y h k f x y k h k f x y k k f x y hk ++++⎧⎪=++++⎪⎪=⎪⎪=+⎨⎪⎪=+⎪⎪⎪=+⎩ 经典的龙格-库塔法每一步需要4次计算函数值(,)f x y ,它具有四阶精度,即局部截断误差是5()O h 。

● 程序框图:● 具体算例及求解结果:求解初值问题'2,01(0)1x y y x y y ⎧=-<<⎪⎨⎪=⎩求解结果:n xn y()n y x0.2 1.183229 1.183229 0.4 1.341667 1.341667 0.6 1.483281 1.483281 0.8 1.612514 1.612514 1.01.732142 1.732142● 输入变量、输出变量说明:输入变量:00(,)x y 处置点,h 区间长度,N 计算次数数值计算方法上机实验报告11输出变量:11(,)x y 初值问题的数值解法结果上机体验与收获首先,是程序的编制过程中,我体会到了将一个抽象的数值计算方法变为一个具体计算机程序的不易。

这个过程,让我对各种数值计算方法的数学公式有了更进一步的认识,因为要编制出计算机程序,就必须清楚数值计算方法的具体计算步骤。

并且这次我还补充了自己的C 语言知识,学会了C 语言中文件的操作,这一部分内容在原先的C 语言课程中式没有讲述过的。

在各个程序的调试过程中,我又重新复习C 语言的很多知识,比如数组元素的编号以及数组行列的编号都是从0开始的等。

数值计算方法编程过程中涉及到了许多循环结构,这很好的锻炼了我的数学思维。

其次,我要说的事此次试验报告的写作,运用了Mathtype 在Word 里面编辑了如此多的数学公式,让我对运用Mathtype 进行数学公式编辑以及Word 排版都有了新的认识。

参考文献[1]谭浩强,C 程序设计,北京,清华大学出版社,2005[2]马东升,雷勇军,数值计算方法,机械工业出版社,2006。

相关文档
最新文档