当前位置:文档之家› C++编写数值分析程序

C++编写数值分析程序

C++编写数值分析程序
C++编写数值分析程序

高斯消去法;

#include

using namespace std;

template

T** Allocation2D(int m, int n)

{

T **a;

a = new T*[m];

for (int i=0; i

{

a[i] = new T[n];

}

return a;

}

int main()

{

int i,j,k;

int n;

float** a;

cout<<"输入系数矩阵的N值,N:";

cin>>n;

a = Allocation2D(n, n+1);

cout<

for(i=0; i

{

for(j=0; j

{

cin>>a[i][j];

}

}

for(k=0; k

{

for(i=k+1; i

{

for(j=k+1; j

{

a[i][j] = a[i][j] - a[i][k] * a[k][j] / a[k][k];

}

}

}

float temp;

a[n-1][n] = a[n-1][n] / a[n-1][n-1];

for(k=n-2; k>=0; k--)

{

temp = 0;

for(j=k+1; j

{

temp = temp + a[k][j] * a[j][n];

}

a[k][n] = (a[k][n] - temp) / a[k][k];

}

for(i=0; i

{

cout<<"x"<

}

return 0;

}

拉格朗日插值法

#include

#include

#define N 3

using namespace std;

double fun(double *x,double *y, int n,double p);

void main()

{

int i;

double a[N],p;

double b[N];

cout<<"please input xiangliang a= "<

for(i=0;i

{cin>>a[i];}

cout<<"please input xiangliang b= "<

for(i=0;i

{cin>>b[i];}

cout<<"please input LagelangrichazhiJieDian p= "<

cin>>p;

cout<<"The Answer= "<

}

double fun(double x[],double y[], int n,double p)

{

double z=0,s=1.0;

int k,i=0;

double L[N];

k=0;

while(k

{

if(k==0)

{

for(i=1;i

{

s=s*(p-x[i])/(x[0]-x[i]);

}

L[0]=s*y[0];

k=k+1;

}

else

{

s=1.0;

for(i=0;i<=k-1;i++)

{

s=s*((p-x[i])/(x[k]-x[i]));

}

for(i=k+1;i

{

s=s*((p-x[i])/(x[k]-x[i]));

}

L[k]=s*y[k];

k++;

}

}

for(i=0;i

{

z=z+L[i];

}

return z;

}

Newton插值法;

#include

#include

void main()

{

char L;

do

{

double M[100][100];

double x[100],y[100];

double X=1,xx=0,w=1,N=0,P,R=1;

int n;

cout<<"请输入所求均差阶数:";

cin>>n;

for(int i=0;i<=n;i++)

{

cout<<"请输入x"<

cin>>x[i];

cout<<"请输入y"<

cin>>y[i];

M[i][0]=x[i];

M[i][1]=y[i];

}

for( int j=2;j<=n+1;j++)

{

for( i=1;i<=n;i++)

{

M[i][j]=(M[i][j-1]-M[i-1][j-1])/(M[i][0]-M[i-j+1][0]);

}

}

for(i=1;i<=n;i++)

{

cout<<"其"<

}

cout<<"请输入x的值:x=";

cin>>xx;

for(i=0;i

{

X*=xx-x[i];

N+=M[i+1][i+2]*X;

P=M[0][1]+N; cout<<"其函数值:y="<

cout<

cin>>L;

}while(L=='y'); }

高斯列主元消去法;#include

#include

using namespace std;

int main()

{double max(double a, double b,double c=0);

int i,j,t;

double temp[3];

double a[3][3]={0.012,0.01,0.167,1,0.8334,5.91,3200,1200,4.2}; double b[3]={0.6781,12.1,981};

double x[3];

for (i=0;i<=2;i++)

{if(a[i][0]=max(a[0][0] ,a[1][0],a[2][0]))

t=i;

for(i=0;i<=2;i++)

temp[i]=a[t][i];

a[t][i]=a[0][i];

a[0][i]=temp[i];}

double l21=a[1][0]/a[0][0];

a[1][1]=a[1][1]-a[0][1]*l21;

a[1][2]=a[1][2]-a[0][2]*l21;

b[1]=b[1]-b[0]*l21;

double l31=a[2][0]/a[0][0];

a[2][1]=a[2][1]-a[0][1]*l31;

a[2][2]=a[2][2]-a[0][2]*l31;

b[2]=b[2]-b[0]*l31;

for (i=0;i<=2;i++)

{if(a[i][1]==max(a[1][0] ,a[2][0]))

t=i;

for(i=0;i<=2;i++)

temp[i]=a[t][i];

a[t][i]=a[0][i];

a[0][i]=temp[i];}

double l32=a[2][1]/a[1][1];

a[2][2]=a[2][2]-a[1][2]*l32;

b[2]=b[2]-b[1]*l32;

x[2]=b[2]/a[2][2];

x[1]=(b[1]-a[1][2]*x[2])/a[1][1];

x[0]=(b[0]-a[0][1]*x[1]-a[0][2]*x[2])/a[0][0];

cout<<"x1="<>a;

cout<<"please input precision:";

cin>>pr;

do

{

a1=a;

a=f(a);

i++;

if(i>1000000)

{cout<<"Iterative is defeated!";return 0;} }

while((a-a1)>pr||(a-a1)<-pr);

cout<<"Iterative Numbers is "<

{

return pow((x+1.0),(1.0/3));

}

数值积分(梯形和辛普生公式)

#include

double f(double x)

{

return(x/(4+x*x));

}

double S(double a,double b)

{

double u,h,c;

h=(b-a)/6;

c=(a+b)/2;

u=f(a)+f(b)+4*f(c);

return (h*u);

}

double F(double x)

{

return(x/(4+x*x));

}

double T(double a,double b)

{

double u,h;

h=(b-a)/2;

u=F(a)+F(b);

return (h*u);

}

void main()

{

int c; //循环控制量

int i=1; //求解次数

printf("----数值积分求解-----\n");

printf("1、利用辛普生公式;\n");

printf("2、利用梯形公式;\n");

printf("0、退出。\n\n");

printf("请选择以上操作(1、2、0)\n");

printf("选择操作:\t");

scanf("%d",&c);

for(;c!=0;) //循环实现多次求解{

switch(c)

{

case 1:

{

double temp;

double a,b;

printf("----------------------------------第%d 次求解\n",i++);

printf("\n--辛普生公式--:\n\n");

printf("输入积分上线:a\t");

scanf("%lf",&a);

printf("输入积分下线:b\t");

scanf("%lf",&b);

temp=S(a,b);

printf("F(X)=%lf\n\n ",temp);

printf("选择操作:\t");

scanf("%d",&c);

}

break;

case 2:

{

double a,b;

printf("----------------------------------第%d 次求解\n",i++);

printf("\n--梯形公式--\n\n");

printf("输入积分上线:a\t");

scanf("%lf",&a);

printf("输入积分下线:b\t");

scanf("%lf",&b);

double T(double ,double );

printf("F(X)=%lf\n\n",T(a,b));

printf("选择操作:\t");

scanf("%d",&c);

};

break;

default:

{

printf("你的选择有误!\n");

printf("请选择以上操作(1、2、0)\n");

printf("选择操作:\t");

scanf("%d",&c);

}break;

}

}

}

用计算器求超越方程数值解的几个简单有趣的例子

用计算器求超越方程数值解的几个简单有趣的例子 孟也清(原创)REV1.02 01052013 很显然,这些超越方程都可以编个简单程序解决,但这里说的是仅使用普通函数计算器, JUST FOR FUN! 解方程1 X=Cos(X) 这可能是世界上最简单的用函数计算器迭代方式解超越方程的例子了,只要你连续按函数计算器上的COS键。第一个近似解可以是计算器上显示的任何数字,如一开机为0就可按键,或是99999999都无所谓,因为COS是周期函数,所有数字都会以2π为模。 按键若干次后你就看到那个解趋近你使用的计算器的最高精度。 在8位计算器上得到X=0.7390851,约按键50次, 在10位计算器上得到X=0.739085133,约按键52次, 在Windows上的32位计算器上为X=0.73908513321516064165531208767387,约按键200次。 注意上面X是弧度 若X是“度“则收敛更快, 仅10次即可得到32位解X=0.9998477415310881129598107686798 解方程2 X= - LOG(X) 见下图,蓝色为y=log(x), 紫色为y=-x, 交点约为X=0.4 若用X取对数再取正值后再迭代,其过程发散。 所以这样解, 将两次相近的解的几何平均值代回去迭代。有弦位法的意思。 X0=0.4 X1’=-Log(X0) =0.39794 X1=(X0+X1’)/2=0.39897 经过10次迭代可得到 X10=0.399012978260252 用几何平均值代回去迭代,也是10次,因为Xn范围很小。 1

解方程3 X=10LOG(X) 若X为功率,而10LOG(X)表示dBm,则在数值上有两个点它们是相等的。 即求解方程X=10LOG(X)的两个解。 见下图,蓝色为y=x, 紫色为y=10log(x), 交点2约为X=10,y=10LOG(10)=10,此点可用直接迭代求出,但收敛速度不很快。 交点1约为X=1.4,此点用直接迭代或上面平均值迭代均发散,反而在计算器上用凑数法比较快,为1.371288573~4 当然可考虑牛顿法(切线法)切线法似乎也会发散。弦位法应可以,没试过。 2

数值分析之幂法及反幂法C语言程序实例

数值分析之幂法及反幂法C 语言程序实例 1、算法设计方案: ①求1λ、501λ和s λ的值: s λ:s λ表示矩阵的按模最小特征值,为求得s λ直接对待求矩阵A 应用反幂法即可。 1λ、501λ:已知矩阵A 的特征值满足关系 1n λλ<< ,要求1λ、及501λ时,可 按如下方法求解: a . 对矩阵A 用幂法,求得按模最大的特征值1m λ。 b . 按平移量1m λ对矩阵A 进行原点平移得矩阵1m B A I λ=+,对矩阵B 用反幂法 求得B 的按模最小特征值2m λ。 c . 321m m m λλλ=- 则:113min(,)m m λλλ=,13max(,)n m m λλλ=即为所求。 ②求和A 的与数5011 140 k k λλμλ-=+最接近的特征值 ik λ(k=0,1,…39): 求矩阵A 的特征值中与k μ最接近的特征值的大小,采用原点平移的方法: 先求矩阵 B=A-k μI 对应的按模最小特征值k β,则k β+k μ即为矩阵A 与k μ最接近的特征值。 重复以上过程39次即可求得ik λ(k=0,1,…39)的值。 ③求A 的(谱范数)条件数2cond()A 和行列式det A : 在(1)中用反幂法求矩阵A 的按模最小特征值时,要用到Doolittle 分解方法,在Doolittle 分解完成后得到的两个矩阵分别为L 和U ,则A 的行列式可由U 阵求出,即:det(A)=det(U)。 求得det(A)不为0,因此A 为非奇异的实对称矩阵,则: max 2()s cond A λλ= ,max λ和s λ分别为模最大特征值与模最小特征值。

数值计算方法比较

有限差分方法(FDM:Finite Difference Method)是计算机数值模拟最早采用的方法,至今仍被广泛运用。该方法将求解域划分为差分网格,用有限个网格节点代替连续的求解域。有限差分法以Taylor级数展开等方法,把控制方程中的导数用网格节点上的函数值的差商代替进行离散,从而建立以网格节点上的值为未知数的代数方程组。有限差分法主要集中在依赖于时间的问题(双曲型和抛物型方程)。有限差分法方面的经典文献有Richtmeyer & Morton的《Difference Methods for Initial-Value Problems》;R. LeVeque《Finite Difference Method for Differential Equations》;《Numerical Methods for C onservation Laws》。 注:差分格式: (1)从格式的精度来划分,有一阶格式、二阶格式和高阶格式。 (2)从差分的空间形式来考虑,可分为中心格式和逆风格式。 (3)考虑时间因子的影响,差分格式还可以分为显格式、隐格式、显隐交替格式等。 目前常见的差分格式,主要是上述几种形式的组合,不同的组合构成不同的差分格式。差分方法主要适用于有结构网格,网格的步长一般根据实际地形的情况和柯朗稳定条件来决定。 构造差分的方法: 构造差分的方法有多种形式,目前主要采用的是泰勒级数展开方法。其基本的差分表达式主要有三种形式:一阶向前差分、一阶向后差分、一阶中心差分和二阶中心差分等,其中前两种格式为一阶计算精度,后两种格式为二阶计算精度。通过对时间和空间这几种不同差分格式的组合,可以组合成不同的差分计算格式。 有限差分法的不足:由于采用的是直交网格,因此较难适应区域形状的任意性,而且区分不出场函数在区域中的轻重缓急之差异,缺乏统一有效的处理自然边值条件和内边值条件的方法,难以构造高精度(指收敛阶)差分格式,除非允许差分方程联系更多的节点(这又进一步增加处理边值条件韵困难)。另外它还有编制不出通用程序的困难。 有限差分法的优点:该方法是一种直接将微分问题变为代数问题的近似数值解法,数学概念 直观,表达简单,精度可选而且在一个时间步内,对于一个给定点来说其相关的空间点只是 与该相邻的几点,而不是全部的空间点。是发展较早且比较成熟的数值方法 广义差分法(有限体积法)(GDM:Generalized Difference Method):1953年,Mac—Neal 利用积分插值法(也称积分均衡法)建立了三角网格上的差分格 式,这就是以后通称的不规划网格上的差分法.这种方法的几何误差小,特别是给出了处理自然边值条件(及内边值条件)的有效方法,堪称差分法的一大进步。1978年,李荣华利用有限元空间和对偶单元上特征函数的推广——局部Taylor展式的公项,将积分插值法改写成广义Galerkin法形式,从而将不规则网格差分法推广为广义差分法.其基本思路是,将计算区域划分为一系列不重复的控制体积,并使每个网格点周围有

演讲稿数值分析应用实例.doc

非线性方程求根 问题:在相距100m的两座建筑物(高度相等的点)之间悬挂一根电缆,仅允许电缆在中间最多下垂1m,试计算所需电缆的长度。 设空中电缆的曲线(悬链线)方程为 ] , [ , ) ( 50 50 2 - ∈ + = - x e e a y a x a x (1) 由题设知曲线的最低点)) ( , (0 0y与最高点)) ( , (50 50y之间的高度差为1m,所以有 1 2 50 50 + = +- a e e a a a) ( (2) 由上述方程解出a后,电缆长度可用下式计算: ) ( ) (a a a x a x L e e a dx e e dx x y ds L 50 50 50 50 50 2 1- - - - = ? ? ? ? ? ? + = ' + = =? ? ?(3) 相关Matlab命令: 1、描绘函数] , [ , ) ( ) (1500 500 1 2 50 50 ∈ - - + = - a a e e a a y a a 的图形;

2、用fzero 命令求方程在1250=a 附近的根的近似值x ,并计算)(x y 的函数值; 3、编写二分法程序,用二分法求0=)(a y 在],[13001200内的根,误差不超过310-,并给出对分次数; 4、编写Newton 迭代法程序,并求0=)(a y 在],[13001200内的根,误差不超过310-,并给出迭代次数。 5、编写Newton 割线法程序,并求0=)(a y 在],[13001200内的根,误差不超过310-,并给出迭代次数。

线性方程组求解应用实例 问题:投入产出分析 国民经济各个部门之间存在相互依存的关系,每个部门在运转中将其他部门的产品或半成品(称为投入)经过加工变为自己的产品(称为产出),如何根据各部门间的投入产出关系,确定各部门的产出水平,以满足社会需求,是投入产出分析中研究的课题。考虑下面的例子: 设国民经济由农业、制造业和服务业三个部门构成,已知某年它们之间的投入产出关系、外部需求、初始投入等如表1所示(数字表示产值)。 表1 国民经济三个部门间的关系单位:亿元 假定总投入等于总产出,并且每个部门的产出与它的投入成正比,由上表可以确定三个部门的投入产出表:如表2所示。 表2 三个部门的投入产出表

数值分析实验报告1

实验一误差分析 实验1.1(病态问题) 实验目的:算法有“优”与“劣”之分,问题也有“好”与“坏”之别。对数值方法的研究而言,所谓坏问题就是问题本身对扰动敏感者,反之属于好问题。通过本实验可获得一个初步体会。 数值分析的大部分研究课题中,如线性代数方程组、矩阵特征值问题、非线性方程及方程组等都存在病态的问题。病态问题要通过研究和构造特殊的算法来解决,当然一般要付出一些代价(如耗用更多的机器时间、占用更多的存储空间等)。 问题提出:考虑一个高次的代数多项式 显然该多项式的全部根为1,2,…,20共计20个,且每个根都是单重的。现考虑该多项式的一个扰动 其中ε(1.1)和(1.221,,,a a 的输出b ”和“poly ε。 (1(2 (3)写成展 关于α solve 来提高解的精确度,这需要用到将多项式转换为符号多项式的函数poly2sym,函数的具体使用方法可参考Matlab 的帮助。 实验过程: 程序: a=poly(1:20); rr=roots(a); forn=2:21 n form=1:9 ess=10^(-6-m);

ve=zeros(1,21); ve(n)=ess; r=roots(a+ve); -6-m s=max(abs(r-rr)) end end 利用符号函数:(思考题一)a=poly(1:20); y=poly2sym(a); rr=solve(y) n

很容易的得出对一个多次的代数多项式的其中某一项进行很小的扰动,对其多项式的根会有一定的扰动的,所以对于这类病态问题可以借助于MATLAB来进行问题的分析。 学号:06450210 姓名:万轩 实验二插值法

数值分析(计算方法)总结

第一章绪论 误差来源:模型误差、观测误差、截断误差(方法误差)、舍入误差 是的绝对误差,是的误差,为的绝对误差限(或误差限) 为的相对误差,当较小时,令 相对误差绝对值得上限称为相对误差限记为:即: 绝对误差有量纲,而相对误差无量纲 若近似值的绝对误差限为某一位上的半个单位,且该位直到的第一位非零数字共有n位,则称近似值有n位有效数字,或说精确到该位。 例:设x==…那么,则有效数字为1位,即个位上的3,或说精确到个位。 科学计数法:记有n位有效数字,精确到。 由有效数字求相对误差限:设近似值有n位有效数字,则其相对误差限为 由相对误差限求有效数字:设近似值的相对误差限为为则它有n位有效数字 令 1.x+y近似值为和的误差(限)等于误差(限)的 和 2.x-y近似值为 3.xy近似值为 4. 1.避免两相近数相减 2.避免用绝对值很小的数作除数 3.避免大数吃小数 4.尽量减少计算工作量 第二章非线性方程求根 1.逐步搜索法 设f (a) <0, f (b)> 0,有根区间为(a, b),从x0=a出发,按某个预定步长(例如h=(b-a)/N)

一步一步向右跨,每跨一步进行一次根的搜索,即判别f(x k)=f(a+kh)的符号,若f(x k)>0(而 f(x k-1)<0),则有根区间缩小为[x k-1,x k] (若f(x k)=0,x k即为所求根), 然后从x k-1出发,把搜索步长再缩小,重复上面步骤,直到满足精度:|x k-x k-1|0.将[a0,b0]对分,中点x0= ((a0+b0)/2),计算 f(x0)。 3.比例法 一般地,设[a k,b k]为有根区间,过(a k, f(a k))、(b k, f(b k))作直线,与x轴交于一点x k,则: 1.试位法每次迭代比二分法多算一次乘法,而且不保证收敛。 2.比例法不是通过使求根区间缩小到0来求根,而是在一定条件下直接构造出一个点列(递推公式),使该点列收敛到方程的根。——这正是迭代法的基本思想。 事先估计: 事后估计 局部收敛性判定定理: 局部收敛性定理对迭代函数的要求较弱,但对初始点要求较高,即初始点必须选在精确解的附近 Steffensen迭代格式: Newton法: Newton下山法:是下山因子 弦割法: 抛物线法:令 其中:

数值分析

数值分析上机报告

前言 随着计算机技术的高速发展,越来越多的科技工作者使用计算机进行科学研究和解决工程技术问题。数值分析(或计算方法)课程的内容是科学工程计算的必备知识,已经成为众多理工科大学生、研究生的必修课程,越来越受到重视。 由于工程实际中所遇到的数学模型求解过程迭代次数很多,计算量很大,所以需要借助很多编程软件来解决,得到一个满足误差限的解。本文所计算题目,均采用C++编程。在本文中使用C++编写了牛顿法、牛顿-Steffensen法方程求解的程序和雅格比法、高斯-赛德尔迭代法求解方程组的程序及Ru n ge-Kutt a4阶算法,并通过实例求解验证了其可行性,比较了求解同一种问题时不同方法之间的优缺性,其中包含解的精确度和解的收敛速度两个重要指标。

一 牛顿法和牛顿-Steffensen 法迭代求解的比较 1. 计算题目 分别用牛顿法,及基于牛顿算法下的Steffensen 加速法 (1) 求ln(x +sin x )=0的根。初值x0分别取0.1, 1,1.5, 2, 4进行计算。 (2) 求sin x =0的根。初值x0分别取1,1.4,1.6, 1.8,3进行计算。 分析其中遇到的现象与问题。 2. 计算过程和结果 1.对方程ln(x +sin x )=0,其导数有些复杂,我们可以对其进行变形,即求解x+sinx=1的解。使用牛顿法,令1sin )(-+=x x x f ,则x x f cos 1)(+=',直至 5 110 1||-+?<-k k x x 时,结束迭代;然后再使用基于牛顿法的Steffensen 加速法进 行计算,直至51101||-+?<-k k x x 时,结束迭代。其迭代结果与迭代次数如下表所示(注N1为牛顿法迭代次数,N2为基于牛顿法Steffensen 加速法迭代次数): 2.对方程sin x =0,使用牛顿法时,令x x f sin )(=,使用牛顿法计算,直至 5 110 1||-+?<-k k x x 时,结束迭代;然后依据Steffensen 加速法进行编程计算,直 至51101||-+?<-k k x x 时,结束迭代。其迭代结果与迭代次数如下表所示:

数值分析在生活中的应用举例及Matlab实现

Matlab 实验报告 学院:数学与信息科学学院班级:信息班 学号:20135034027 姓名:马永杉

最小二乘法,用MATLAB实现 1.数值实例 下面给定的是郑州最近1个月早晨7:00左右的天气预报所得到的温度,按照数据找出任意次曲线拟合方程和它的图像。下面用MATLAB编程对上述数据进行最小二乘拟合。 2、程序代码 x=[1:1:30]; y=[9,10,11,12,13,14,13,12,11,9,10,11,12,13,14,12,11,10,9,8,7,8,9,11,9 ,7,6,5,3,1]; a1=polyfit(x,y,3) %三次多项式拟合% a2= polyfit(x,y,9) %九次多项式拟合% a3= polyfit(x,y,15) %十五次多项式拟合% b1=polyval(a1,x) b2=polyval(a2,x) b3=polyval(a3,x) r1= sum((y-b1).^2) %三次多项式误差平方和% r2= sum((y-b2).^2) %九次次多项式误差平方和% r3= sum((y-b3).^2) %十五次多项式误差平方和% plot(x,y,'*') %用*画出x,y图像% hold on plot(x,b1, 'r') %用红色线画出x,b1图像% hold on plot(x,b2, 'g') %用绿色线画出x,b2图像% hold on plot(x,b3, 'b:o') %用蓝色o线画出x,b3图像% 2.流程图

4.数值结果分析 不同次数多项式拟合误差平方和为: r1=67.6659 r2=20.1060 r3=3.7952 r1、r2、r3分别表示三次、九次、十五次多项式误差平方和。 5、拟合曲线如下图

数值分析实验报告

数值分析实验报告 姓名:周茹 学号: 912113850115 专业:数学与应用数学 指导老师:李建良

线性方程组的数值实验 一、课题名字:求解双对角线性方程组 二、问题描述 考虑一种特殊的对角线元素不为零的双对角线性方程组(以n=7为例) ?????????? ?????? ? ???? ?d a d a d a d a d a d a d 766 55 44 3 32 211??????????????????????x x x x x x x 7654321=?????????? ? ???????????b b b b b b b 7654321 写出一般的n (奇数)阶方程组程序(不要用消元法,因为不用它可以十分方便的解出这个方程组) 。 三、摘要 本文提出解三对角矩阵的一种十分简便的方法——追赶法,该算法适用于任意三对角方程组的求解。 四、引言 对于一般给定的d Ax =,我们可以用高斯消去法求解。但是高斯消去法过程复杂繁琐。对于特殊的三对角矩阵,如果A 是不可约的弱对角占优矩阵,可以将A 分解为UL ,再运用追赶法求解。

五、计算公式(数学模型) 对于形如????? ?? ????? ??? ?---b a c b a c b a c b n n n n n 111 2 2 2 11... ... ...的三对角矩阵UL A =,容易验证U 、L 具有如下形式: ??????? ????? ??? ?=u a u a u a u n n U ...... 3 3 22 1 , ?? ????? ? ?? ??????=1 (1) 1132 1l l l L 比较UL A =两边元素,可以得到 ? ?? ??-== = l a b u u c l b u i i i i i i 111 i=2, 3, ... ,n 考虑三对角线系数矩阵的线性方程组 f Ax = 这里()T n x x x x ... 2 1 = ,()T n f f f f ... 2 1 = 令y Lx =,则有 f Uy = 于是有 ()?????-== --u y a f y u f y i i i i i 1 1 11 1 * i=2, 3, ... ,n 再根据y Lx =可得到

数值计算方法大作业

目录 第一章非线性方程求根 (3) 1.1迭代法 (3) 1.2牛顿法 (4) 1.3弦截法 (5) 1.4二分法 (6) 第二章插值 (7) 2.1线性插值 (7) 2.2二次插值 (8) 2.3拉格朗日插值 (9) 2.4分段线性插值 (10) 2.5分段二次插值 (11) 第三章数值积分 (13) 3.1复化矩形积分法 (13) 3.2复化梯形积分法 (14) 3.3辛普森积分法 (15) 3.4变步长梯形积分法 (16) 第四章线性方程组数值法 (17) 4.1约当消去法 (17) 4.2高斯消去法 (18) 4.3三角分解法 (20)

4.4雅可比迭代法 (21) 4.5高斯—赛德尔迭代法 (23) 第五章常积分方程数值法 (25) 5.1显示欧拉公式法 (25) 5.2欧拉公式预测校正法 (26) 5.3改进欧拉公式法 (27) 5.4四阶龙格—库塔法 (28)

数值计算方法 第一章非线性方程求根 1.1迭代法 程序代码: Private Sub Command1_Click() x0 = Val(InputBox("请输入初始值x0")) ep = Val(InputBox(请输入误差限ep)) f = 0 While f = 0 X1 = (Exp(2 * x0) - x0) / 5 If Abs(X1 - x0) < ep Then Print X1 f = 1 Else x0 = X1 End If Wend End Sub 例:求f(x)=e2x-6x=0在x=0.5附近的根(ep=10-10)

1.2牛顿法 程序代码: Private Sub Command1_Click() b = Val(InputBox("请输入被开方数x0")) ep = Val(InputBox(请输入误差限ep)) f = 0 While f = 0 X1 = x0 - (x0 ^ 2 - b) / (2 * b) If Abs(X1 - x0) < ep Then Print X1 f = 1 Else x0 = X1 End If Wend End Sub 例:求56的值。(ep=10-10)

数值分析简述及求解应用

数值分析简述及求解应用 摘要:数值分析是研究分析用计算机求解数学计算问题的数值计算方法及其理论的学科,本文主要介绍了数值分析的一些求解方法的原理和过程,并应用在电流回路和单晶硅提拉过程中的,进一步体现数值分析的实际应用。 关键字:解方程组插值法牛顿法 一、引言 随着科学技术的发展,提出了大量复杂的数值计算问题,在建立电子计算机成为数值计算的主要工具以后,它以数字计算机求解数学问题的理论和方法为研究对象。有可靠的理论分析,要有数值实验,并对计算的结果进行误差分析。数值分析的主要内容包括插值法,函数逼近,曲线拟和,数值积分,数值微分,解线性方程组的直接方法,解线性方程组的迭代法,非线性方程求根,常微分方程的数值解法。运用数值分析解决问题的过程包括: 实际问题→数学建模→数值计算方法→程序设计→上机计算求出结果。 在自然科学研究和工程技术中有许多问题可归结为求解方程组的问题,方程组求解是科学计算中最常遇到的问题。如在应力分析、电路分析、分子结构、测量学中都会遇到解方程组问题。在很多广泛应用的数学问题的数值方法中,如三次样条、最小二乘法、微分方程边值问题的差分法与有限元法也都涉及到求解方程组。 在工程中常会遇到求解线性方程组的问题,解线性方程组的方法有直接法和迭代法,直接法就是经过有限步算术运算,可求的线性方程组精确解的方法(若计算过程没有舍入误差),但实际犹如舍入误差的存在和影响,这种方法也只能求得近似解,这类方法是解低阶稠密矩阵方程组级某些大型稀疏矩阵方程组的有效方法。直接法包括高斯消元法,矩阵三角分解法、追赶法、平方根法。迭代法就是利用某种极限过程去逐步逼近线性方程组精确解的方法。将方程组的解看作是某极限过程的极限值,且计算这一极限值的每一步是利用前一步所得结果施行相同的演算步骤而进行。迭代法具有需要计算机的存储单元少,程序设计简单,原始系数矩阵在计算过程始终不变等优点,但存在收敛性级收敛速度问题。迭代法是解大型稀疏矩阵方程组(尤其是微分方程离散后得到的大型方程组)的重要方法。迭代法包括Jacobi法SOR法、SSOR法等多种方法。非线性是实际问题中经常用到出现的并在科学和工程中的低位也越来越重要,很多线性模型都是在一定条件下由非线性简化得到的。所以往往需要非线性的研究。非线性的数值解法有牛顿法,迭代收敛的加速解法,弦解法和抛物线法等。还有很多问题都可用常微分方程的定解来描述,主要有处置问题和边值问题。常微分方程是描述连续变化的数学语言,微分方程的求解是确定满足给定方程的可微函数y(x)。下面就数值分析中常用的一些方法和实例进行阐述。 二、数值分析中的一些方法 1、插值法 许多实际问题都用y=f(x)来表示,有的函数虽然有解析式,但由于计算复杂实用不方便,为了找一个既能反映函数的特性又便于计算的函数,我们利用插值法可以得到这个简单函数,插值法包括拉格朗日插值,牛顿插值,Hermite插值等多种方法。 拉格朗日插值是n次多项式插值,其成功地用构造插值基函数的方法解决了

数值分析课程设计学生题目

《数值分析》课程设计

本课程设计的内容为:每个小组的同学均应完成以下五个案例; 目标:能将数值分析课程中所学的算法知识熟练应用于实际问题中。 案例1 土木工程和环境工程师在设计一条排水渠道时必须考虑渠道的各种参数(如宽度,深度,渠道内壁光滑度)及水流速度、流量、水深等物理量之间的关系。 假设修一条横断面为矩形的水渠,其宽度为B ,假定水流是定常的,也就是说水流速度不随时间而变化。 根据质量守恒定律可以得到 Q=UBH (1.1) 其中Q 是水的流量(s m /3 ),U 是流速(s m /),H 是水的深度(m )。 在水工学中应用的有关流速的公式是 3 /23 /22/1)2()(1H B BH S n U += (1.2) 这里n 是Manning 粗糙系数,它是一个与水渠内壁材料的光滑性有关的无量纲量;S 是水渠 的斜度系数,也是一个无量纲量,它代表水渠底每米内的落差。 把(1.2)代入(1.1)就得到 3 /23 /52/1)2()(1H B BH S n U += (1.3) 为了不同的工业目的(比如说要把污染物稀释到一定的浓度以下,或者为某工厂输入一定量 的水),需要指定流量Q 和B ,求出水的深度。这样,就需要求解 0) 2()(1)(3 /23 /52/1=-+=Q H B BH S n H f (1.4) 一个具体的案例是 s m Q S n m B /5 ,0002.0 ,03.0 ,203==== 求出渠道中水的深度H 。 所涉及的知识——非线性方程解法。 案例2 在化学工程中常常研究在一个封闭系统中同时进行的两种可逆反应 C D A C B A ?+?+2 其中A ,B ,C 和D 代表不同的物质。反应达到平衡是有如下的平衡关系: d a c b a c C C C k C C C k == 22 1 , 其中2 24 1107.3 ,104--?=?=k k 称为平衡常数,),,,(d c b a n C n =代表平衡状态时该物质的浓度。假定反应开始时各种物质的浓度为:

数值分析实验报告模板

数值分析实验报告模板 篇一:数值分析实验报告(一)(完整) 数值分析实验报告 1 2 3 4 5 篇二:数值分析实验报告 实验报告一 题目:非线性方程求解 摘要:非线性方程的解析解通常很难给出,因此线性方程的数值解法就尤为重要。本实验采用两种常见的求解方法二分法和Newton法及改进的Newton法。利用二分法求解给定非线性方程的根,在给定的范围内,假设f(x,y)在[a,b]上连续,f(a)xf(b) 直接影响迭代的次数甚至迭代的收敛与发散。即若x0 偏离所求根较远,Newton法可能发散的结论。并且本实验中还利用利用改进的Newton法求解同样的方程,且将结果与Newton法的结果比较分析。 前言:(目的和意义) 掌握二分法与Newton法的基本原理和应用。掌握二分法的原理,验证二分法,在选对有根区间的前提下,必是收

敛,但精度不够。熟悉Matlab语言编程,学习编程要点。体会Newton使用时的优点,和局部收敛性,而在初值选取不当时,会发散。 数学原理: 对于一个非线性方程的数值解法很多。在此介绍两种最常见的方法:二分法和Newton法。 对于二分法,其数学实质就是说对于给定的待求解的方程f(x),其在[a,b]上连续,f(a)f(b) Newton法通常预先要给出一个猜测初值x0,然后根据其迭代公式xk?1?xk?f(xk) f'(xk) 产生逼近解x*的迭代数列{xk},这就是Newton法的思想。当x0接近x*时收敛很快,但是当x0选择不好时,可能会发散,因此初值的选取很重要。另外,若将该迭代公式改进为 xk?1?xk?rf(xk) 'f(xk) 其中r为要求的方程的根的重数,这就是改进的Newton 法,当求解已知重数的方程的根时,在同种条件下其收敛速度要比Newton法快的多。 程序设计: 本实验采用Matlab的M文件编写。其中待求解的方程写成function的方式,如下 function y=f(x);

(完整版)哈工大-数值分析上机实验报告

实验报告一 题目:非线性方程求解 摘要:非线性方程的解析解通常很难给出,因此线性方程的数值解法就尤为重要。本实验采用两种常见的求解方法二分法和Newton法及改进的Newton法。 前言:(目的和意义) 掌握二分法与Newton法的基本原理和应用。 数学原理: 对于一个非线性方程的数值解法很多。在此介绍两种最常见的方法:二分法和Newton法。 对于二分法,其数学实质就是说对于给定的待求解的方程f(x),其在[a,b]上连续,f(a)f(b)<0,且f(x)在[a,b]内仅有一个实根x*,取区间中点c,若,则c恰为其根,否则根据f(a)f(c)<0是否成立判断根在区间[a,c]和[c,b]中的哪一个,从而得出新区间,仍称为[a,b]。重复运行计算,直至满足精度为止。这就是二分法的计算思想。

Newton法通常预先要给出一个猜测初值x0,然后根据其迭代公式 产生逼近解x*的迭代数列{x k},这就是Newton法的思想。当x0接近x*时收敛很快,但是当x0选择不好时,可能会发散,因此初值的选取很重要。另外,若将该迭代公式改进为 其中r为要求的方程的根的重数,这就是改进的Newton法,当求解已知重数的方程的根时,在同种条件下其收敛速度要比Newton法快的多。 程序设计: 本实验采用Matlab的M文件编写。其中待求解的方程写成function的方式,如下 function y=f(x); y=-x*x-sin(x); 写成如上形式即可,下面给出主程序。 二分法源程序: clear %%%给定求解区间 b=1.5; a=0;

%%%误差 R=1; k=0;%迭代次数初值 while (R>5e-6) ; c=(a+b)/2; if f12(a)*f12(c)>0; a=c; else b=c; end R=b-a;%求出误差 k=k+1; end x=c%给出解 Newton法及改进的Newton法源程序:clear %%%% 输入函数 f=input('请输入需要求解函数>>','s') %%%求解f(x)的导数 df=diff(f);

数值计算方法》试题集及答案

《计算方法》期中复习试题 一、填空题: 1、已知3.1)3(,2.1)2(,0.1)1(===f f f ,则用辛普生(辛卜生)公式计算求得 ?≈3 1 _________ )(dx x f ,用三点式求得≈')1(f 。 答案:2.367,0.25 2、1)3(,2)2(,1)1(==-=f f f ,则过这三点的二次插值多项式中2 x 的系数为 ,拉 格朗日插值多项式为 。 答案:-1, )2)(1(21 )3)(1(2)3)(2(21)(2--------= x x x x x x x L 3、近似值*0.231x =关于真值229.0=x 有( 2 )位有效数字; 4、设)(x f 可微,求方程)(x f x =的牛顿迭代格式是( ); 答案 )(1)(1n n n n n x f x f x x x '--- =+ 5、对1)(3 ++=x x x f ,差商=]3,2,1,0[f ( 1 ),=]4,3,2,1,0[f ( 0 ); 6、计算方法主要研究( 截断 )误差和( 舍入 )误差; 7、用二分法求非线性方程 f (x )=0在区间(a ,b )内的根时,二分n 次后的误差限为 ( 1 2+-n a b ); 8、已知f (1)=2,f (2)=3,f (4)=5.9,则二次Newton 插值多项式中x 2系数为( 0.15 ); 11、 两点式高斯型求积公式?1 d )(x x f ≈( ?++-≈1 )] 321 3()3213([21d )(f f x x f ),代数精度 为( 5 ); 12、 为了使计算 32)1(6 )1(41310-- -+-+ =x x x y 的乘除法次数尽量地少,应将该表达 式改写为 11 ,))64(3(10-= -++=x t t t t y ,为了减少舍入误差,应将表达式1999 2001-

数值分析实验报告

实验一、误差分析 一、实验目的 1.通过上机编程,复习巩固以前所学程序设计语言及上机操作指令; 2.通过上机计算,了解误差、绝对误差、误差界、相对误差界的有关概念; 3.通过上机计算,了解舍入误差所引起的数值不稳定性。 二.实验原理 误差问题是数值分析的基础,又是数值分析中一个困难的课题。在实际计算中,如果选用了不同的算法,由于舍入误差的影响,将会得到截然不同的结果。因此,选取算法时注重分析舍入误差的影响,在实际计算中是十分重要的。同时,由于在数值求解过程中用有限的过程代替无限的过程会产生截断误差,因此算法的好坏会影响到数值结果的精度。 三.实验内容 对20,,2,1,0 =n ,计算定积分 ?+=10 5dx x x y n n . 算法1:利用递推公式 151--=n n y n y , 20,,2,1 =n , 取 ?≈-=+=1 00182322.05ln 6ln 51dx x y . 算法2:利用递推公式 n n y n y 51511-= - 1,,19,20 =n . 注意到 ???=≤+≤=10 10202010201051515611261dx x dx x x dx x , 取 008730.0)12611051(20120≈+≈y .: 四.实验程序及运行结果 程序一: t=log(6)-log(5);

n=1; y(1)=t; for k=2:1:20 y(k)=1/k-5*y(k-1); n=n+1; end y y =0.0884 y =0.0581 y =0.0431 y =0.0346 y =0.0271 y =0.0313 y =-0.0134 y =0.1920 y =-0.8487 y =4.3436 y =-21.6268 y =108.2176 y =-541.0110 y =2.7051e+003 y =-1.3526e+004 y =6.7628e+004 y =-3.3814e+005 y =1.6907e+006 y =-8.4535e+006 y =4.2267e+007 程序2: y=zeros(20,1); n=1; y1=(1/105+1/126)/2;y(20)=y1; for k=20:-1:2 y(k-1)=1/(5*k)-(1/5)*y(k); n=n+1; end 运行结果:y = 0.0884 0.0580 0.0431 0.0343 0.0285 0.0212 0.0188 0.0169

数值计算实例

数值计算 插值 假设需要得到x 坐标每改变0.1 时的y 坐标, 用三次插值方法对机翼断面下缘轮廓线上的部分数据加细, 并作出插值函数的图形. 程序: clear, close all x=[0,3,5,7,9,11,12,13,14,15]; y=[0,1.2,1.7,2.0,2.1,2.0,1.8,1.2,1.0,1.6]; plot(x,y); xi=0:0.1:15; yi_cubic=interp1(x,y,xi,'cubic'); plot(x,y,'ro',xi,yi_cubic); pp=csape(x,y,'second'); v=ppval(pp,xi); v; T=(ppval(pp,0.1)-ppval(pp,0))/0.1; angle=atan(T)*180/pi; s=v(130:151); ss=min(s); 图形: 最小二乘拟合

已知空气温度与动力粘度关系如下,进行最小二乘拟合 0℃170.8×10^-4mPa.s 40℃190.4×10^-4mPa.s 74 ℃210.2×10^-4mPa.s 229 ℃263.8×10^-4mPa.s 334℃312.3×10^-4mPa.s 409℃341.3×10^-4mPa.s 481℃358.3×10^-4mPa.s 565℃375.0×10^-4mPa.s 638℃401.4×10^-4mPa.s 750 ℃426.3×10^-4mPa.s 810 ℃441.9×10^-4mPa.s 程序: >> x=[0 40 74 229 334 409 481 565 638 750 810]; >> y=[170.8 190.4 210.2 263.8 312.3 341.3 358.3 375.0 401.4 426.3 441.9]; >> p=polyfit(x,y,2) p = -0.0002 0.4652 172.5460 >> xi=[0:2:810]; >> yi=polyval(p,xi); >> plot(x,y,'ko-',xi,yi,'k--') 解线性方程组的直接法

数值分析2016上机实验报告

序言 数值分析是计算数学的范畴,有时也称它为计算数学、计算方法、数值方法等,其研究对象是各种数学问题的数值方法的设计、分析及其有关的数学理论和具体实现的一门学科,它是一个数学分支。是科学与工程计算(科学计算)的理论支持。许多科学与工程实际问题(核武器的研制、导弹的发射、气象预报)的解决都离不开科学计算。目前,试验、理论、计算已成为人类进行科学活动的三大方法。 数值分析是计算数学的一个主要部分,计算数学是数学科学的一个分支,它研究用计算机求解各种数学问题的数值计算方法及其理论与软件实现。现在面向数值分析问题的计算机软件有:C,C++,MATLAB,Python,Fortran等。 MATLAB是matrix laboratory的英文缩写,它是由美国Mathwork公司于1967年推出的适合用于不同规格计算机和各种操纵系统的数学软件包,现已发展成为一种功能强大的计算机语言,特别适合用于科学和工程计算。目前,MATLAB应用非常广泛,主要用于算法开发、数据可视化、数值计算和数据分析等,除具备卓越的数值计算能力外,它还提供了专业水平的符号计算,文字处理,可视化建模仿真和实时控制等功能。 本实验报告使用了MATLAB软件。对不动点迭代,函数逼近(lagrange插值,三次样条插值,最小二乘拟合),追赶法求解矩阵的解,4RungeKutta方法求解,欧拉法及改进欧拉法等算法做了简单的计算模拟实践。并比较了各种算法的优劣性,得到了对数值分析这们学科良好的理解,对以后的科研数值分析能力有了极大的提高。

目录 序言 (1) 问题一非线性方程数值解法 (3) 1.1 计算题目 (3) 1.2 迭代法分析 (3) 1.3计算结果分析及结论 (4) 问题二追赶法解三对角矩阵 (5) 2.1 问题 (5) 2.2 问题分析(追赶法) (6) 2.3 计算结果 (7) 问题三函数拟合 (7) 3.1 计算题目 (7) 3.2 题目分析 (7) 3.3 结果比较 (12) 问题四欧拉法解微分方程 (14) 4.1 计算题目 (14) 4.2.1 方程的准确解 (14) 4.2.2 Euler方法求解 (14) 4.2.3改进欧拉方法 (16) 问题五四阶龙格-库塔计算常微分方程初值问题 (17) 5.1 计算题目 (17) 5.2 四阶龙格-库塔方法分析 (18) 5.3 程序流程图 (18) 5.4 标准四阶Runge-Kutta法Matlab实现 (19) 5.5 计算结果及比较 (20) 问题六舍入误差观察 (22) 6.1 计算题目 (22) 6.2 计算结果 (22) 6.3 结论 (23) 7 总结 (24) 附录

(完整版)数值分析每节课的教学重点、难点

计算方法教案新疆医科大学 数学教研室 张利萍

一、课程基本信息 1、课程英文名称:Numerical Analysis 2、课程类别:专业基础课程 3、课程学时:总学时54 4、学分:4 5、先修课程:《高等数学》、《线性代数》、《Matlab 语言》 二、课程的目的与任务: 计算方法是信息管理与信息系统专业的重要理论基础课程,是现代数学的一个重要分支。其主要任务是介绍进行科学计算的理论方法,即在计算机上对来自科学研究和工程实际中的数学问题进行数值计算和分析的理论和方法。通过本课程的学习,不仅使学生初步掌握数值分析的基本理论知识,而且使学生具备一定的科学计算的能力、分析问题和解决问题的能力,为学习后继课程以及将来从事科学计算、计算机应用和科学研究等工作奠定必要的数学基础。 三、课程的基本要求: 1.掌握计算方法的常用的基本的数值计算方法 2.掌握计算方法的基本理论、分析方法和原理 3.能利用计算机解决科学和工程中的某些数值计算应用问题,增强学生综合运用知识的能力 4.了解科学计算的发展方向和应用前景 四、教学内容、要求及学时分配: (一) 理论教学: 引论(2学时) 第一讲(1-2节) 1.教学内容: 计算方法(数值分析)这门课程的形成背景及主要研究内容、研究方法、主要特点;算法的有关概念及要求;误差的来源、意义、及其有关概念。数值计算中应注意的一些问题。 2.重点难点: 算法设计及其表达法;误差的基本概念。数值计算中应注意的一些问题。3.教学目标: 了解数值分析的基本概念;掌握误差的基本概念:误差、相对误差、误差限、相对误差限、有效数字;理解有效数字与误差的关系。学会选用相对较好的数值计算方法。

数值分析实验报告1

实验一 误差分析 实验1.1(病态问题) 实验目的:算法有“优”与“劣”之分,问题也有“好”与“坏”之别。对数值方法的研究而言,所谓坏问题就是问题本身对扰动敏感者,反之属于好问题。通过本实验可获得一个初步体会。 数值分析的大部分研究课题中,如线性代数方程组、矩阵特征值问题、非线性方程及方程组等都存在病态的问题。病态问题要通过研究和构造特殊的算法来解决,当然一般要付出一些代价(如耗用更多的机器时间、占用更多的存储空间等)。 问题提出:考虑一个高次的代数多项式 )1.1() ()20()2)(1()(20 1∏=-=---=k k x x x x x p 显然该多项式的全部根为1,2,…,20共计20个,且每个根都是单重的。现考虑该多项式的一个扰动 )2.1(0 )(19=+x x p ε 其中ε是一个非常小的数。这相当于是对(1.1)中19x 的系数作一个小的扰动。我们希望比较(1.1)和(1.2)根的差别,从而分析方程(1.1)的解对扰动的敏感性。 实验内容:为了实现方便,我们先介绍两个Matlab 函数:“roots ”和“poly ”。 roots(a)u = 其中若变量a 存储n+1维的向量,则该函数的输出u 为一个n 维的向量。设a 的元素依次为121,,,+n a a a ,则输出u 的各分量是多项式方程 01121=+++++-n n n n a x a x a x a 的全部根;而函数 poly(v)b = 的输出b 是一个n+1维变量,它是以n 维变量v 的各分量为根的多项式的系数。可见“roots ”和“poly ”是两个互逆的运算函数。 ;000000001.0=ess );21,1(zeros ve = ;)2(ess ve =

相关主题
文本预览
相关文档 最新文档