数值分析实验及程序
- 格式:doc
- 大小:111.00 KB
- 文档页数:4
第1篇一、实验目的通过本次实验,掌握追赶法的基本原理和计算步骤,了解追赶法在解三对角线性方程组中的应用,并学会利用C++编程实现追赶法,提高编程能力。
二、实验原理追赶法是一种解三对角线性方程组的迭代方法,其基本原理是利用递推公式逐步求解未知数。
对于形如Ax=b的三对角线性方程组,其中系数矩阵A具有如下形式:A = [a_00, a_01, 0, ..., 0;a_10, a_11, a_12, ..., 0;0, a_21, a_22, ..., a_2n-1;...;0, ..., 0, a_n2]追赶法将系数矩阵A分解为两个因子L和U,其中L为下三角矩阵,U为上三角矩阵,即:A = LU其中:L = [1, 0, ..., 0;a_10/a_11, 1, 0, ..., 0;..., ..., ..., ...;a_n1/a_n2, ..., ..., ..., 1]U = [a_11, a_12, ..., a_1n;0, a_22, ..., a_2n-1;..., ..., ..., ...;0, ..., ..., a_n2]通过递推公式求解L和U中的元素,进而得到解向量x:x_1 = b_1 / a_11x_i = (b_i - ∑(j=1 to i-1) l_ij x_j) / u_ij, i = 2, ..., n三、实验步骤1. 编写C++程序,实现追赶法的基本算法。
2. 生成三对角线性方程组的系数矩阵A和解向量b。
3. 调用C++程序,计算追赶法的结果,并输出解向量x。
4. 分析追赶法的计算过程,验证结果是否正确。
四、实验数据及结果1. 生成三对角线性方程组的系数矩阵A和解向量b。
假设A为:A = [2, -1, 0, 0, 0;-1, 2, -1, 0, 0;0, -1, 2, -1, 0;0, 0, -1, 2, -1;0, 0, 0, -1, 2]b = [1, 1, 1, 1, 1]2. 追赶法计算结果。
数值分析实验题和程序实验2.1多项式插值的振荡现象问题提出:考虑在一个固定的区间上用插值逼近一个函数。
显然Lagrange插值中使用的节点越多,插值多项式的次数就越高。
我们自然关心插值多项的次数增加时,L n(x)是否也更加靠近被逼近的函数。
Runge 给出的一个例子是极著名并富有启发性的。
设区间[-1, 1]上函数1f (x) 21+25 x实验内容:考虑区间[-1,1]的一个等距划分,分点为2iXj=-1 •, i =0,1, 2,…,nn则拉格朗日插值多项式为1l i(x)21 25 x i其中,h (x), i = 0,1, 2,…,n是n次Lagrange插值基函数。
实验要求:(1)选择不断增大的分点数目n =2, 3,… 画出原函数f (x)及插值多项式函数L n(x)在[-1,1]上的图像,比较并分析实验结果。
(2)选择其他的函数,例如定义在区间[-5,5]上的函数xh(x) = ---------- , g(x) =arctan x1 +x重复上述的实验,看其结果如何。
1、实验MATLAB 程序function charpt2_1%输入:函数式选择,插值节点数%输出:拟合函数及原函数的图形promps={'选择实验函数,若选f(x),输入f,若选h(x),输入h,若选g(x),输入g:'};result=inputdlg(promps, 'charpt2_1',1,{ 'f'});Nb_f=char(result);if (Nb_f~= 'f' & Nb_f~= 'h' & Nb_f~= 'g')errordlg( '实验函数选择错误!'); return ;endresult=inputdlg({ '请输入第一幅图插值节点数N>=2:'},'charpt2_1',1,{ '2'}); Nd0=str2num(char(result));if (Nd0<2)errordlg( '节点数输入错误!'); return ;endresult=inputdlg({ '请输入两幅图间插值节点数差值D:'}, 'charpt2_1',1,{ '1'}); D=str2num(char(result));switch Nb_fcase'f'f=inline( '1./(1+25*x.A2)' );a=-1;b=1;case'h'f=inline( 'x./(1+x.A4)' );a=-5;b=5;case'g'f=inline( 'atan(x)');a=-5;b=5;endfor i=1:6Nd=Nd0+(i-1).*D;x0=linspace(a,b,Nd+1); y0=feval(f,x0);x=a:0.01:b;y=Lagrange(x0,y0,x);subplot(2,3,i);plot(x0,y0, '*');hold on;fplot(f,[a,b], 'k');hold on;plot(x,y, 'b--');s1='x (节点数N='; s2=num2str(Nd);s3=')'; s=[s1 s2 s3]; xlabel(s);ylabel( 'y=f(x) - and y=Ln(x)--' ); end%Lagra nge插值函数function y=Lagrange(x0,y0,x) n=length(x0);m=length(x);for i=1:m z=x(i); s=0.0;for k=1:np=1.0;for j=1:n if (j~=k) p=p*(z-x0(j))/(x0(k)-x0(j));end end s=s+p*y0(k);end y(i)=s;end2、实验结果对于函数f(x),当选择的分点数冃不断增大时,得到的拟合插值多项 式函数图形如图1-1和图1-2所示。
数值分析实验报告模板篇一:数值分析实验报告(一)(完整)数值分析实验报告12345篇二:数值分析实验报告实验报告一题目:非线性方程求解摘要:非线性方程的解析解通常很难给出,因此线性方程的数值解法就尤为重要。
本实验采用两种常见的求解方法二分法和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);y=-x*x-sin(x);写成如上形式即可,下面给出主程序。
《数值分析》实验报告实验序号:实验二 实验名称: 列主元消去法解方程组 学号: 姓名:任课教师: 专业班级:)1、 实验目的:用列主元Gauss 消元法解n 阶线性代数方程组:⎪⎪⎩⎪⎪⎨⎧=+⋯++⋯⋯⋯⋯⋯=+⋯++=+⋯++nn nn 2n21n12n 2n 2221211n 1n 212111b a a a b a a a b a a a x x x x x x x x x 其基本做法是把上述方程组通过列主元Gauss 消元转化为一个等价的三角形方程组,然后再进行回代就可以求出方程组的解。
列主元消元的基本做法是选取系数矩阵的每一列中绝对值最大的作为主元,然后采取和顺序Gauss 消元法相同的步骤进行 ,求得方程组的解。
要求显示出每一个列主元以及每一大步消元后的系数矩阵),...,2,1(n k =(k )A 和常数项),...,2,1(n k =(k )b ,最后显示出方程组的解),...,2,1(n i x i =。
2、 实验内容:(1)实验分析:1. 列主元Gauss 消元法的算法思想:1. 输入增广矩阵B ;。
2. 对k =1,2,…,n ,循环:(a ) 按列选主元||:max ik ni j a a ≤≤=保存主元所在行的指标k i 。
(b ) 若a=0,则系数矩阵奇异,计算停止;否则,顺序进行。
(c ) 若k i =k 则转向(d );否则换行ki kj i b b nj a a k j k ↔=↔,...,2,1 ,(d ) 计算乘子.,...,1,/n k i a a a m ik kk ik ik +=⇒=(e ) 消元: nk i b m b b nk j i a m a a k ik i i kj ij ij ij ,...,1;:,...,1,;:+=-=+=-=3. 回代 1,...,1, ,/:1-=⎪⎪⎭⎫ ⎝⎛-=∑+=n n i a b a b b ii n i j j ij i i 用右端项b 来存放解x 。
第1篇一、实验目的本次实验旨在通过编程实现数值分析中的几种重要算法,包括线性方程组求解、方程求根、插值与曲线拟合等,加深对数值分析理论的理解,提高编程能力和实际应用能力。
二、实验内容1. 线性方程组求解(1)高斯消元法:通过将矩阵化为上三角形式,再进行回代求解。
(2)克劳斯消元法:对矩阵进行逐行归一化处理,逐行消元。
(3)列主元素法:每次选取列主元素进行消元。
2. 方程求根(1)二分法:在给定区间内,通过不断缩小区间,逼近方程的根。
(2)Newton法:利用导数信息,通过迭代计算逼近方程的根。
(3)不动点迭代法:通过迭代过程,将初始值逐步逼近方程的根。
(4)弦截法:利用弦线与x轴的交点,近似求解方程的根。
3. 插值与曲线拟合(1)拉格朗日插值法:通过构造拉格朗日插值多项式,逼近函数在给定点的值。
(2)牛顿插值法:利用差商表,构造牛顿插值多项式,逼近函数在给定点的值。
(3)最小二乘法:通过最小化误差平方和,拟合曲线。
三、实验步骤1. 线性方程组求解(1)设计程序,实现高斯消元法。
(2)设计程序,实现克劳斯消元法。
(3)设计程序,实现列主元素法。
2. 方程求根(1)设计程序,实现二分法。
(2)设计程序,实现Newton法。
(3)设计程序,实现不动点迭代法。
(4)设计程序,实现弦截法。
3. 插值与曲线拟合(1)设计程序,实现拉格朗日插值法。
(2)设计程序,实现牛顿插值法。
(3)设计程序,实现最小二乘法。
四、实验结果与分析1. 线性方程组求解(1)高斯消元法:通过实验,验证高斯消元法可以成功求解线性方程组。
(2)克劳斯消元法:通过实验,验证克劳斯消元法可以成功求解线性方程组。
(3)列主元素法:通过实验,验证列主元素法可以成功求解线性方程组。
2. 方程求根(1)二分法:通过实验,验证二分法可以成功逼近方程的根。
(2)Newton法:通过实验,验证Newton法可以成功逼近方程的根。
(3)不动点迭代法:通过实验,验证不动点迭代法可以成功逼近方程的根。
实验9.1-2:
在多项式插值中,Chebyshev 正交多项式的零点作为插值基点一般优于等
距插值基点。
原因在于出现在误差公式中的项1
()n
i i x x =-∏,如果i x =cos[(2i-1)π/2n],
则对区间【-1,1】中的一切x 总有|1
()n
i i x x =-∏|≤12n -,对n=4,8,16做数值检验来验证
这个不等式。
(1) 实验分析:
当n=4,8,16时,根据i x =cos[(2i-1)π/2n],(其中i=1,2,…n)算出Chebyshev 正交
多项式()n T x 的零点。
题目中要求对【-1,1】中的一切x ,|1
()n
i i x x =-∏|≤12n -总成立。
比较直观的想法是,在VC++中,我们将区间【-1,1】平均分,取遍所有的节点,当分割无
限加细的时候,可以看成是取遍了【-1,1】中的一切x 。
由于1
()n
i i x x =-∏它在【-1,1】上
是连续的,当这里的x 使得不等式均成立事,可以近似的看成是该不等式成立。
(2)VC++程序: # include<iostream.h> #include<iomanip.h> # include<math.h> double f(int x) { double E=2.00; for(int l=0;l<x;l++)E/=2; return E; }
void main(void) { int n; double pi=3.1415926; cout<<"请输入n 的值!\n"; cin>>n; int m; cout<<"请输入分割区间【-1,1】的分数m:\n";
cin>>m;
double *x=new double[n];
double *y=new double[m];
double h;
h=(double)2/m;
cout<<"分割区间长度为:"<<h<<'\n';
y[0]=-1;
for(int k=0;k<m;k++)
{
y[k]=y[0]+h*k;
}
for(int i=0,j=0;i<n;i++)
{
x[i]=cos((2*(i+1)-1)*pi/2/n);
cout<<setw(8)<<x[i]<<'\t';
j++;
if(j%4==0)
cout<<'\n';
}
for(int s=0;s<m;s++)
{ double e=1.00;
for(int t=0;t<n;t++)
e*=(y[s]-x[t]);
if((abs(e)-f(n))<=0)continue;
}
cout<<"s="<<s<<'\n';
if(s==m)cout<<"经数值检验,不等式成立!";
else cout<<"结论不成立!";
}
(3)VC++程序的输出结果:
当n=4时的输出结果为:
当n=8时的输出结果为:
当n=16时的输出结果为:
(4)数值检验方法的改进:
遇到的问题:在VC++中,由于它本身功能的限制,无法准确地实现本题中
“对区间【-1,1】中的一切x 总有|1
()n
i i x x =-∏|≤12n -”这个不等式的检验。
于是就
转向其他的功能齐全的数学方面的应用软件的帮助,例如说mathematic 软件,Matlab 软件等等,借助它们本身的功能来完成该问题的检验。
(5)改进后的方法的输出结果:
、
(6)实验结果的分析:
已知Chebyshev 正交多项式()n T x =cos[n*arccos(x)] , n=0,1,2,… 它具有以下的性质: 1) ()n T x 是
n 次多项式,首项系数为12n -;
2) ()n T x 在【-1,1】上有n 个不同的实零点,且i x =cos[(2i-1)π/2n],i=1,2,…,n ; 3)
()n T x 在【-1,1】上的n+1个点k x =cos(k π/n),k=0,1,…,n 处轮流取最大值1
和最小值-1;
理论推导:由以上性质1)、2)可以得出:
1
1
()()2
n
n i
n i T x x x -==
-∏,
而由性质3)可以得出,()n T x 在【-1,1】上的取值范围为【-1,1】 于是:
1
1
()()
2
n
n i
n i T x x x -==
-∏,
而
1
()2
n n T x -=
1
()2
n n T x -≤
1
12
n -,
于是就有|1
()n
i i x x =-∏|≤12n -。