太原理工大学数值计算方法实验报告
数值计算方法实验分析报告

学生实验报告实验课程名称数值计算方法开课实验室数学实验室实验五解线性方程组的直接方法实验(主元的选取与算法的稳定性)问题提出:消去法是我们在线性代数中已经熟悉的。
但由于计算机的数值运算是在一个有限的浮点数集合上进行的,如何才能确保消去法作为数值算法的稳定性呢?消去法从理论算法到数值算法,其关键是主元的选择。
主元的选择从数学理论上看起来平凡,它却是数值分析中十分典型的问题。
实验内容:考虑线性方程组nn Rn∈=⨯,Ax∈,RbAb编制一个能自动选取主元,又能手动选取主元的求解线性方程组的消去过程。
实验要求:()取矩阵⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=1415157,6816816816M O O Ob A ,则方程有解Tx )1,,1,1(*Λ=。
取计算矩阵的条件数。
让程序自动选取主元,结果如何?()现选择程序中手动选取主元的功能。
每步消去过程总选取按模最小或按模尽可能小的元素作为主元,观察并记录计算结果。
若每步消去过程总选取按模最大的元素作为主元,结果又如何?分析实验的结果。
()取矩阵阶数或者更大,重复上述实验过程,观察记录并分析不同的问题及消去过程中选择不同的主元时计算结果的差异,说明主元素的选取在消去过程中的作用。
()选取其他你感兴趣的问题或者随机生成矩阵,计算其条件数。
重复上述实验,观察记录并分析实验结果。
实验(线性代数方程组的性态与条件数的估计) 问题提出:理论上,线性代数方程组b Ax =的摄动满足⎪⎪⎭⎫ ⎝⎛∆+∆∆-≤∆-b b A A AA A cond x x 11)( 矩阵的条件数确实是对矩阵病态性的刻画,但在实际应用中直接计算它显然不现实,因为计算1-A 通常要比求解方程b Ax =还困难。
实验内容:中提供有函数“”可以用来估计矩阵的条件数,它给出的是按范数的条件数。
首先构造非奇异矩阵和右端,使得方程是可以精确求解的。
再人为地引进系数矩阵和右端的摄动b A ∆∆和,使得bA ∆∆和充分小。
数值计算方法实验报告

数值计算方法实验报告一、实验介绍本次实验是关于数值计算方法的实验,旨在通过计算机模拟的方法,实现对于数值计算方法的掌握。
本次实验主要涉及到的内容包括数值微积分、线性方程组的求解、插值与拟合、常微分方程的数值解等。
二、实验内容1. 数值微积分数值微积分是通过计算机模拟的方法,实现对于微积分中的积分运算的近似求解。
本次实验中,我们将会使用梯形公式和辛普森公式对于一定区间上的函数进行积分求解,并比较不同公式的计算误差。
2. 线性方程组的求解线性方程组求解是数值计算领域中的重要内容。
本次实验中,我们将会使用高斯消元法、LU分解法等方法对于给定的线性方程组进行求解,并通过比较不同方法的计算效率和精度,进一步了解不同方法的优缺点。
3. 插值与拟合插值与拟合是数值计算中的另一个重要内容。
本次实验中,我们将会使用拉格朗日插值法和牛顿插值法对于给定的数据进行插值求解,并使用最小二乘法对于给定的函数进行拟合求解。
4. 常微分方程的数值解常微分方程的数值解是数值计算中的难点之一。
本次实验中,我们将会使用欧拉法和龙格-库塔法等方法对于给定的常微分方程进行数值解的求解,并比较不同方法的计算精度和效率。
三、实验结果通过本次实验,我们进一步加深了对于数值计算方法的理解和掌握。
在数值微积分方面,我们发现梯形公式和辛普森公式都能够有效地求解积分,但是辛普森公式的计算精度更高。
在线性方程组求解方面,我们发现LU分解法相对于高斯消元法具有更高的计算效率和更好的数值精度。
在插值与拟合方面,我们发现拉格朗日插值法和牛顿插值法都能够有效地进行插值求解,而最小二乘法则可以更好地进行函数拟合求解。
在常微分方程的数值解方面,我们发现欧拉法和龙格-库塔法都能够有效地进行数值解的求解,但是龙格-库塔法的数值精度更高。
四、实验总结本次实验通过对于数值计算方法的模拟实现,进一步加深了我们对于数值计算方法的理解和掌握。
在实验过程中,我们了解了数值微积分、线性方程组的求解、插值与拟合、常微分方程的数值解等多个方面的内容,在实践中进一步明确了不同方法的特点和优缺点,并可以通过比较不同方法的计算效率和数值精度来选择合适的数值计算方法。
数值计算方法实验报告

数值计算方法实验报告实验目的:通过实验验证不同数值计算方法在求解数学问题时的精度和效率,并分析其优缺点。
实验原理:实验内容:本实验选取了三个典型的数值计算问题,并分别采用了二分法、牛顿迭代法和梯度下降法进行求解。
具体问题和求解方法如下:1. 问题一:求解方程sin(x)=0的解。
-二分法:利用函数值的符号变化将解空间不断缩小,直到找到满足精度要求的解。
-牛顿迭代法:通过使用函数的斜率来逼近方程的解,并不断逼近真实解。
-梯度下降法:将方程转化为一个极小化问题,并利用梯度下降的方式逼近极小值点,进而找到方程的解。
2.问题二:求解函数f(x)=x^2-3x+2的极小值点。
-二分法:通过确定函数在一个区间内的变化趋势,将极小值所在的区间不断缩小,从而找到极小值点。
-牛顿迭代法:通过使用函数的导数和二阶导数来逼近极小值点,并不断逼近真实解。
-梯度下降法:将函数转化为一个极小化问题,并利用梯度下降的方式逼近极小值点,进而找到函数的极小值点。
3. 问题三:求解微分方程dy/dx = -0.1*y的解。
-二分法:通过离散化微分方程,将微分方程转化为一个差分方程,然后通过迭代计算不同点的函数值,从而得到函数的近似解。
-牛顿迭代法:将微分方程转化为一个积分方程,并通过迭代计算得到不同点的函数值,从而得到函数的近似解。
-梯度下降法:将微分方程转化为一个极小化问题,并利用梯度下降的方式逼近极小值点,从而得到函数的近似解。
实验步骤:1.编写代码实现各个数值计算方法的求解过程。
2.对每个数值计算问题,设置合适的初始值和终止条件。
3.运行程序,记录求解过程中的迭代次数和每次迭代的结果。
4.比较不同数值计算方法的精度和效率,并分析其优缺点。
实验结果:经过实验测试,得到了如下结果:-问题一的二分法迭代次数为10次,求解结果为x=0;牛顿迭代法迭代次数为4次,求解结果为x=0;梯度下降法迭代次数为6次,求解结果为x=0。
-问题二的二分法迭代次数为10次,求解结果为x=1;牛顿迭代法迭代次数为3次,求解结果为x=1;梯度下降法迭代次数为4次,求解结果为x=1-问题三的二分法迭代次数为100次,求解结果为y=e^(-0.1x);牛顿迭代法迭代次数为5次,求解结果为y=e^(-0.1x);梯度下降法迭代次数为10次,求解结果为y=e^(-0.1x)。
数值计算方法实验报告

3如果f[(a+b)/2]>0,则区间(a,(a+b)/2)内存在零点,(a+b)/2≤b;
返回①重新循环,不断接近零点。通过每次把f(x)的零点所在区间收缩一半的方法,使区间内的两个端点逐步逼近函数零点,最终求得零点近似值。
{
int z[10];
int maxi,maxj;
initdata();
for(int i=1;i<=N;i++)
z[i]=i;
for(int k=1;k<N;k++)
{
maxi=k;maxj=k;float maxv=abs(a[k][k]);
for(i=k;i<=N;i++)
for(int j=k;j<=N;j++)
34;请输入矩阵阶数:"<<endl;
cin>>N;
cout<<"请输入矩阵各项:"<<endl;
for(int i=1;i<=N;i++)
for(int j=1;j<=N+1;j++)
{
cin>>a[i][j];
}
cout<<endl;
}
void main()
{
for(i=1;i<=N;i++)
{
float t=a[i][k];a[i][k]=a[i][maxj];a[i][maxj]=t;
数值计算方法实验报告

数值计算⽅法实验报告《数值计算⽅法》实验报告实验题⽬⼆分法求⾮线性⽅程的根专业班级11级数学师范⼆班姓名李洪学号201102024056指导⽼师李梦联系电话188********⼀、实验⽬的熟悉⼆分法求⽅程近似根的数值⽅法,与⽤计算器解出的值进⾏⽐较,并学会误差分析。
⼆、实验原理⼆分法的基本思路是通过计算隔根区间的中点,逐步将隔根区间缩⼩,从⽽可得⽅程的近似根数列}{n x 。
(≤-+1*k x x ?)三、实验内容已知0)()3(3=-=-e x x f 在[]1,0上有⼀个实根*x ,0)1(0)0(>本实验中的⽤到的求根⽅法有①⼆分法,②计算器求根。
四、实验步骤1.输⼊:a ,b 值及精度控制?量;2.if 0)()(>b f a f then 返回第1步,重新输⼊a ,b 值else 转第3步;3.while ?>-b a 时做(1))(21b a x +=,计算)(x f ;if )(x f =0 then 输出x ,停机。
(2)if0)()(4.输出)(21b a x +=。
五、 Matlab 源程序1.erfen.m:function [c,err,yc]=erfen(f,a,b,delta)ya = feval(f,a);yb = feval(f,b);if ya * yb > 0 ,return,endmax1 = 1+round((log(b-a)-log(delta))/log(2));for k=1:max1c=(a+b)/2;yc=feval(f,c);if yc==0a=c;b=c;elseif yb * yc > 0b=c;yb=yc;elsea=c;ya=yc;endif b-aendc=(a+b)/2;err=abs(b-a);yc=feval(f,c);2.f.m:function f=f(x);f=x^3-exp(-x);六、运⾏结果七、计算机计算结果⼋、实验分析1、⼆分法和计算器均能解出⽅程的根。
数值计算方法I实验报告

实验报告实验课程名称数值计算方法I开课实验室数学实验室学院理学院年级2012 专业班信息与计算科学2班学生姓名学号开课时间2012 至2013 学年第 2 学期实验一 误差分析试验1.1(病态问题)问题提出:考虑一个高次的代数多项式)1.1()()20()2)(1()(201∏=-=---=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)的解对扰动的敏感性。
实验内容:为了实现方便,我们先介绍两个MA TLAB 函数:“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 ”是两个互逆的运算函数。
))20:1((;)2();21,1(;000000001.0ve poly roots ess ve zeros ve ess +===上述简单的MA TLAB 程序便得到(1.2)的全部根,程序中的“ess ”即是(1.2)中的ε。
实验要求:(1)选择充分小的ess ,反复进行上述实验,记录结果的变化并分析它们。
如果扰动项的系数ε很小,我们自然感觉(1.1)和(1.2)的解应当相差很小。
计算中你有什么出乎意料的发现?表明有些解关于如此的扰动敏感性如何?(2)将方程(1.2)中的扰动项改成18x ε或其它形式,实验中又有怎样的现象? (3)(选作部分)请从理论上分析产生这一问题的根源。
太原理工大学数值计算方法实验报告

printf("%lf ",x[i]);printf("\n");}int _tmain(int argc, _TCHAR* argv[]){double a[3][4],x[3]={0,0,0},d[3];for(int i=0;i<3;i++)for(int j=0;j<4;j++)scanf("%lf",&a[i][j]);shuchu(x);do{x[0]=(a[0][3]-a[0][1]*x[1]-a[0][2]*x[2])/a[0][0];x[1]=(a[1][3]-a[1][0]*x[0]-a[1][2]*x[2])/a[1][1];x[2]=(a[2][3]-a[2][0]*x[0]-a[2][1]*x[1])/a[2][2];d[0]=abs((a[0][3]-a[0][1]*x[1]-a[0][2]*x[2])/a[0][0]-x[0]);d[1]=abs((a[1][3]-a[1][0]*(a[0][3]-a[0][1]*x[1]-a[0][2]*x[2])/a[0][0]-a[1][2]*x[2]) /a[1][1]-x[1]);d[2]=abs((a[2][3]-a[2][0]*(a[0][3]-a[0][1]*x[1]-a[0][2]*x[2])/a[0][0]-a[2][1]*(a[1] [3]-a[1][0]*(a[0][3]-a[0][1]*x[1]-a[0][2]*x[2])/a[0][0]-a[1][2]*x[2])/a[1][1])/a[2][2]-x[2]);shuchu(x);}while(d[0]>0.5e-5&&d[1]>0.5e-5&&d[2]>0.5e-5);system("pause");return 0;}实验结果与分析1.列主元素消元法2.完全组元素消元法3.LU分解法4.高斯-赛德尔迭代法讨论、心得(可选):了解Gauss消元法、LU分解法、追赶法等线性方程组直接求解的基本方法、基本原理;能够按照工程实际要求,选择适当的算法;通过编写程序,进行算法设计和数值求解,了解雅可比迭代法、高斯-赛德尔迭代法等线性方程组迭代求解的基本方法、基本原理,能够按照工程实际要求,选择适当的算法,通过编写程序,进行算法设计和数值求解。
数值计算方法实验报告

《数值计算方法》实验报告班级数学132班学号201300144402姓名袁媛2016年 1月3日实验报告一1. 实验名称解线性方程组的直接法 2.实验题目用追赶法求解下列方程组⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎪⎪⎭⎫ ⎝⎛101053-001-21-002-31-001-24321x x x x 3.实验目的熟练运用已经学过的方法计算方程组,巩固已经学到的解决方程组的方法,培养使用计算机进行科学计算和解决问题的能力,熟悉了解这样的系数矩阵,能运用追赶法进行方程组的求解。
4.基础理论设A 有如下形式的分解⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=------11......11...............1211122111122211n n n n n n n n n n t t t s r s r s r s b a c b a c b a c b A 其中,i i r s 和i t 为待定常数,则有1,...,3,2,, (3)2,,,111111-===+====-n i t s c n i s t r b r a t s c s b i i i i i i i i i 由可得如下计算公式:1111111,1,...,3,2,/,,/,---==-==-====n n n n n n i i i i i i i i i t r b s a r n i s c t t r b s a r s c t b s 即在A 满足条件的情况下,可以把{}{}i i s r ,和{}i t 完全确定出来,从而实现上面给定形式的LU 分解,且i r 等于),...3,2(n i a i =。
这样,求解三对角阵方程组Ax=f 就等价于求解两个三角形方程组y Ux f Ly ==, 从而得到公式:(1)计算{}i s 和{}i t 的递推公式 ;1, (3)2,/,,/11111---=-==-==n n n n i i i i i i i t a b s n i s c t t a b s b c t (2)求解f Ly = ni s y a f y b f y i i i i i ,...,3,2,/)(,/1111=-==-(3)求解y Ux =1,...,2,1,,1--=-==+n n i x t y x y x i i i i n n通常把计算121...-→→→n t t t 和n y y y →→→...21的过程称为追的过程,而把计算方程组的解11...x x x n n →→→-的过程称为赶的过程,这一方法称为解三角方程组的追赶法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本科实验报告
课程名称:计算机数值方法
实验项目:方程求根、线性方程组的直接解
法、线性方程组的迭代解法、代数插值和最
小二乘拟合多项式
实验地点:行勉楼
专业班级: ******** 学号: *********
学生姓名: ******** 指导教师:李誌,崔冬华
2016年 4 月 8 日
y = x*x*x + 4 * x*x - 10;
return y;
}
float Calculate(float a,float b)
{
c = (a + b) / 2;
n++;
if (GetY(c) == 0 || ((b - a) / 2) < 0.000005)
{
cout << c <<"为方程的解"<< endl;
return 0;
}
if (GetY(a)*GetY(c) < 0)
{
return Calculate(a,c);
}
if (GetY(c)*GetY(b)< 0)
{
return Calculate(c,b);
}
}
};
int main()
{
cout << "方程组为:f(x)=x^3+4x^2-10=0" << endl;
float a, b;
Text text;
text.Getab();
a = text.a;
b = text.b;
text.Calculate(a, b);
return 0;
}
2.割线法:
// 方程求根(割线法).cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include"iostream"
心得体会
使用不同的方法,可以不同程度的求得方程的解,通过二分法计算的程序实现更加了解二分法的特点,二分法过程简单,程序容易实现,但该方法收敛比较慢一般用于求根的初始近似值,不同的方法速度不同。
面对一个复杂的问题,要学会简化处理步骤,分步骤一点一点的循序处理,只有这样,才能高效的解决一个复杂问题。
2.LU分解法:
#include<stdio.h>
#include<math.h>
int i,j,k,r;
double m=0,p=0;
double a[3][3];
void lu(double a[3][3])
{
for(i=1;i<=2;i++)
{
if(a[0][0]!=0)
a[i][0]=a[i][0]/a[0][0];
}
for(k=1;k<=2;k++)
{
for(j=k;j<=2;j++)
{
{
for(r=0;r<=k-1;r++)
for(i=1;i<=2;i++)
{
for(r=0;r<=i-1;r=r+1)
m=m+a[i][r]*c[r];
c[i]=b[i]-m;
m=0;
}
d[2]=c[2]/f[2][2];
for(i=1;i>=0;i=i-1)
{
for(r=2;r>i;r=r-1)
n=n+f[i][r]*d[r];
d[i]=(c[i]-n)/f[i][i];
n=0;
}
printf("所求方程组解为x1=%f, x2=%f, x3=%f",d[0],d[1],d[2]); /*根据LU分解所得两个矩阵及求解步骤计算所求X一组解*/
}
心得体会
对于求解线性方程组的各种直接方法来说各有优缺点,在所有的求解方法中都应该注意其解的精度。
注意不同求解方法的不同误差求法。
编写程序的时候需要一步一步慢慢来,逐步增加自己的算法知识水平和解决问题的能力。
}
return0;
}
心得体会
在编写算法是不熟悉,查阅了很多资料,经过反复研究和试验后实现了题目的要求,使用雅克比迭代法和高斯-赛德尔都可以得到方程的解,但相比之下,高斯-赛德尔的迭代次数要比雅克比的迭代次数少,能够更快的达到所求的解的精度。
l+=y[i]*m;
m=1;
}
printf("结果为%lf",l);
return 0;
}
最小二乘法:
#include "stdio.h"
#include "math.h"
int main()
{double x[7]={0,0.5,0.6,0.7,0.8,0.9,1.0},
y[7]={1,1.75,1.96,2.19,2.44,2.71,3.00},
a0,a1,sum1=0,sum2=0,sum3=0,sum4=0,sum5=0,l,r; int m=6,i,k;
for(i=0;i<7;i++)
{
sum1+=x[i];
sum2+=x[i]*x[i];
sum3+=y[i];
sum4+=x[i]*y[i];
sum5+=y[i]*y[i];
}
l=sum1/(m+1);
a1=(sum4-l*sum3)/(sum2-l*sum1);
a0=(sum3-sum1*a1)/(m+1);
double s=sum3*a0+sum4*a1;
r=sum5-s;
printf("y=a0+a1*x\n");
printf("a0=%f a1=%f\t\n",a0,a1,r);
double q=0.856,p;
p=a0+a1*q;
printf("y=%f\n",p);
return 0;
}。