数值分析实验2(wangwei)

合集下载

数值分析实验报告2

数值分析实验报告2

实验报告实验项目名称函数逼近与快速傅里叶变换实验室数学实验室所属课程名称数值逼近实验类型算法设计实验日期班级学号姓名成绩512*x^10 - 1280*x^8 + 1120*x^6 - 400*x^4 + 50*x^2 - 1并得到Figure,图像如下:实验二:编写程序实现[-1,1]上n阶勒让德多项式,并作画(n=0,1,…,10 在一个figure中)。

要求:输入Legendre(-1,1,n),输出如a n x n+a n-1x n-1+…多项式。

在MATLAB的Editor中建立一个M-文件,输入程序代码,实现勒让德多项式的程序代码如下:function Pn=Legendre(n,x)syms x;if n==0Pn=1;else if n==1Pn=x;else Pn=expand((2*n-1)*x*Legendre(n-1)-(n-1)*Legendre(n-2))/(n);endx=[-1:0.1:1];A=sym2poly(Pn);yn=polyval(A,x);plot (x,yn,'-o');hold onend在command Windows中输入命令:Legendre(10),得出的结果为:Legendre(10)ans =(46189*x^10)/256 - (109395*x^8)/256 + (45045*x^6)/128 - (15015*x^4)/128 + (3465*x^2)/256 - 63/256并得到Figure,图像如下:实验三:利用切比雪夫零点做拉格朗日插值,并与以前拉格朗日插值结果比较。

在MATLAB的Editor中建立一个M-文件,输入程序代码,实现拉格朗日插值多项式的程序代码如下:function [C,D]=lagr1(X,Y)n=length(X);D=zeros(n,n);D(:,1)=Y';for j=2:nfor k=j:nD(k,j)=(D(k,j-1)- D(k-1,j-1))/(X(k)-X(k-j+1));endendC=D(n,n);for k=(n-1):-1:1C=conv(C,poly(X(k)));m=length(C);C(m)= C(m)+D(k,k);end在command Windows 中输入如下命令:clear,clf,hold on;k=0:10;X=cos(((21-2*k)*pi)./22); %这是切比雪夫的零点Y=1./(1+25*X.^2);[C,D]=lagr1(X,Y);x=-1:0.01:1;y=polyval(C,x);plot(x,y,X,Y,'.');grid on;xp=-1:0.01:1;z=1./(1+25*xp.^2);plot(xp,z,'r')得到Figure ,图像如下所示:比较后发现,使用切比雪夫零点做拉格朗日插值不会发生龙格现象。

数值分析2

数值分析2

序号 1 2 3 4
项目 实验报告排版(3 分) 算法思想分析(6 分) 源代码(6 分) 实验结果及分析(5 分)
得分
总分
为初值)计算 3 的平方根,使误差不超过 10
3
-6
3 x 2 解 3 次代数方程 x x 1 0 , (1.5 为初值)用不动点迭代法 k x k 1 x k
f xk f xk
,使误差不超过 10
-6
实验测试结果及结果分析
1: >> Untitled1 a = 1.7321 i = 5 >> format long >> Untitled1 a = 1.732050807568877 i = 5 3 的平方根是 1.732050807568877 2: (1)>> Untitled1 x = 1.324718011988197 i = 9 (2)>> Untitled1 x = 1.324717957244790 i = 4 用不动点迭代法和牛顿迭代法得到的答案为 1.324717957244790
《数值分析》实验报告(二)
专业 信息与计算科学 班级 1304 班 姓名 卫妮 学号 20130404428
实验项目
迭代法的运用
实验目的
1. 熟练掌握迭代法,明白迭代法的原理和基本思想; 2. 编程实现用迭代法; 3. 熟悉 matlab 软件的使用。
实验内容
1: 用迭代公式
a k 1 1 3 ak 2 ak , (1
实验总结
通过学习 matlab,编程能力有了较大提高,并将其应用于数值分析的迭代法求解方程,在加 深对该领域印象的同时对 matlab 有了更深一层的了解。

数值分析实验报告二

数值分析实验报告二

数值实验报告二一、实验名称解线性方程组的列主元素高斯消去法和LU 分解法二、实验目的通过数值实验,从中体会解线性方程组选主元的必要性和LU 分解法的优点,以及方程组系数矩阵和右端向量的微小变化对解向量的影响。

三、实验内容解下列两个线性方程组(1) ⎪⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎭⎫ ⎝⎛--11134.981.4987.023.116.427.199.103.601.3321x x x (2) ⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎪⎪⎭⎫ ⎝⎛----15900001.582012151526099999.23107104321x x x x 四、算法描述1、 列主元素高斯消去法记: ij ij a a =1)( (i, j = 1,2,3n )i i b b =1)( (i = 1,2,3n )消元过程:对于k = 1,2,3n(1) 选行号k i ,使)()(max k i ni k k k i k k a a ≤≤=。

(2) 交换)(k kj a 与)(k j i k a (j = k, k+1,k+2n )以及)()(k i k k k b b 与所含的数值。

(3)对于i = k, k+1,k+2n ,计算)()(k kkk ik ik a a m =)()()1(k kj ik k ij k ij a m a a -=+ (j = k, k+1,k+2n ))()()1(k k ik k i k i b m b b -=+回代过程:)(n nnn n a b x = )()1)()(/(k kk j n k j k kj k k k a x a a x ∑+=-= (k = n-1, n-2, n-3 1 )在此算法中的)(k k i k a 称为第k 个列主元素,它的数值总要被交换到第k 个主对角线元素的位置上。

2、 LU 分解法通过MATLAB 自有的函数,把系数矩阵A 分解成A=LU ,其中:L 是下三角矩阵,U 是上三角矩阵,这时方程组Ax=b 就可以分解成两个容易求解的三角形方程组Ly=b ,Ux=y 。

数值分析实验报告二求解线性方程组的直接方法

数值分析实验报告二求解线性方程组的直接方法

数值分析实验报告二求解线性方程组的直接方法姓名:刘学超日期:3/28一实验目的1.掌握求解线性方程组的高斯消元法及列主元素法;2.掌握求解线性方程组的克劳特法;3.掌握求解线性方程组的平方根法。

二实验内容1.用高斯消元法求解方程组(精度要求为):2.用克劳特法求解上述方程组(精度要求为)。

3.用平方根法求解上述方程组(精度要求为)。

4.用列主元素法求解方程组(精度要求为):三实验步骤(算法)与结果1用高斯消元法求解方程组(精度要求为):#include stdio.h#define n3 void gauss(double a[n][n],double b[n]){double sum1=0,sum2=0,sum3=0,sum4=0;double l[n][n],z[n],x[n],u[n][n];int i,j,k;for(i=0;i n;i++)l[i][i]=1;for(i=0;i n;i++){for(j=0;j n;j++){if(i=j){for(k=0;k=i-2;k++)sum1+=l[i][k]*u[k][j];u[i][j]=a[i][j]-sum1;}if(i j){for(k=0;k=j-2;k++)sum2+=l[i][k]*u[k][j];l[i][j]=(a[i][j]-sum2)/u[j][j];}}for(k=0;k=i-2;k++)sum3+=l[i][k]*z[k];z[i]=b[i]-sum3;for(i=n-1;i=0;i--){for(k=i;k=n-1;k++)sum4+=u[i][k]*x[k];x[i]=(z[i]-sum4)/u[i][i];}}for(i=0;i n;i++)printf("%.6f",x[i]);}main(){double v[3][3]={{3,-1,2},{-1,2,2},{2,-2,4}};double c[3]={7,-1,0};gauss(v,c);}2用克劳特法求解上述方程组(精度要求为)#include stdio.h#include stdlib.h#include conio.h#define n3 int main(){float u[n][n],l[n][n],d[n]={7,-1,0},x[n];float a[3][3]={{3,-1,2},{-1,2,2},{2,-2,4}};int i,j,k;printf("equations:\n");for(i=0;i n;i++){for(j=0;j n-1;j++)printf("(%f)Y%d+",a[i][j],j+1);printf("(%f)Y%d=%f",a[i][n-1],n,d[i]);printf("\n");}printf("\n");for(j=0;j n;j++)for(i=j;i n;i++)l[i][j]=a[i][j];for(i=0;i n;i++)for(j=i+1;j n;j++)u[i][j]=a[i][j];for(j=1;j n;j++)u[0][j]=u[0][j]/l[0][0];for(k=1;k n;k++){for(j=k;j n;j++)for(i=j;i n;i++)l[i][j]-=l[i][k-1]*u[k-1][j];for(i=k;i n;i++)for(j=i+1;j n;j++)u[i][j]-=l[i][k-1]*u[k-1][j];for(i=k;i n;i++)for(j=i+1;j n;j++)u[k][j]=u[k][j]/l[k][k];}d[0]=d[0]/l[0][0];for(k=0;k 2;k++){for(i=k+1;i n;i++)d[i]-=d[k]*l[i][k];d[k+1]/=l[k+1][k+1];}for(i=0;i n;i++)x[i]=d[i];for(k=n-2;k 2-n;k--)for(i=k;i-1;i--)x[i]-=x[k+1]*u[i][k+1];for(j=0;j n;j++)for(i=j;i n;i++)printf("l[%d][%d]=%f\n",i+1,j+1,l[i][j]);printf("\n");for(i=0;i n;i++)for(j=i+1;j n;j++)printf("u[%d][%d]=%f\n",i+1,j+1,u[i][j]);printf("\n");for(i=0;i n;i++)printf("d%d=%f\n",i+1,d[i]);printf("\n");printf("the result is:\n");for(i=0;i n;i++)printf("Y%d=%f\n",i+1,x[i]);getch();}结果:3用平方根法求解上述方程组(精度要求为)#include stdio.h#define n3 void gauss(double a[n][n],double b[n]) {double sum1=0,sum2=0,sum3=0,sum4=0;double l[n][n],z[n],x[n],u[n][n];int i,j,k;for(i=0;i n;i++)l[i][i]=1;for(i=0;i n;i++){for(j=0;j n;j++){if(i==j){for(k=0;k=i-2;k++)sum1+=pow(l[i][k],2);l[i][j]=sqrt(a[i][i]-sum1);}if(i j){for(k=0;k=j-2;k++)sum2+=l[i][k]*u[k][j];l[i][j]=(a[i][j]-sum2)/l[j][j];}}for(k=0;k=i-2;k++)sum3+=l[i][k]*z[k];z[i]=(b[i]-sum3)/l[i][i];for(i=n-1;i=0;i--){for(k=i;k=n-1;k++)sum4+=l[k][i]*x[k];x[i]=(z[i]-sum4)/l[i][i];}}for(i=0;i n;i++)printf("%.6f",x[i]);}main(){double v[3][3]={{3,-1,2},{-1,2,2},{2,-2,4}};double c[3]={7,-1,0};gauss(v,c);}结果:4用列主元素法求解方程组(精度要求为):#include stdio.h#include math.h#define n3 int main(){float u[n][n],l[n][n],d[n]={7,-1,0},x[n];float a[n][n]={3,-1,2,-1,2,-2,2,-2,4};int i,j,k;printf("equations:\n");for(i=0;i n;i++){for(j=0;j n-1;j++)printf("(%f)Y%d+",a[i][j],j+1);printf("(%f)Y%d=%f",a[i][n-1],n,d[i]);printf("\n");}printf("\n");for(i=0;i n;i++)for(j=0;j n;j++)l[i][j]=a[i][j];for(i=0;i n;i++)for(j=0;j n;j++)u[i][j]=a[i][j];l[0][0]=sqrt(l[0][0]);u[0][0]=sqrt(u[0][0]);for(i=1;i n;i++)l[i][0]/=u[0][0];for(j=1;j n;j++)u[0][j]/=l[0][0];for(k=1;k 3;k++){for(j=0;j k;j++)l[k][k]-=pow(l[k][j],2);l[k][k]=sqrt(l[k][k]);for(j=0;j k;j++)l[i][k]-=l[i][j]*l[k][j];for(i=k+1;i n;i++)for(j=0;j k;j++)l[i][k]/=l[k][k];}d[0]=d[0]/l[0][0];for(k=0;k 2;k++){for(i=k+1;i n;i++)d[i]-=d[k]*l[i][k];d[k+1]/=l[k+1][k+1];}for(i=0;i n;i++)for(j=0;j n;j++)u[i][j]=l[j][i];for(k=n-1;k 1-n;k--){x[k]=d[k]/u[k][k];for(i=k-1;i-1;i--)d[i]=d[i]-u[i][k]*x[k];}for(j=0;j n;j++){for(i=j;i n;i++)printf("l[%d][%d]=%f\n",i+1,j+1,l[i][j]);}printf("\n");for(i=0;i n;i++){for(j=i;j n;j++)printf("u[%d][%d]=%f\n",i+1,j+1,u[i][j]);}printf("\n");printf("the result is:\n");printf("Y%d=%f\n",i+1,x[i]);}结果:四实验收获与教师评语。

《数值分析》实验书详解

《数值分析》实验书详解

数值分析实验指导书目录实验目的 (1)实验基本要求 (2)实验一、误差分析 (3)一、实验目的 (3)二、算法实例 (3)三、实验任务 (10)实验二、插值法 (12)一、实验目的 (12)二、算法实例 (12)三、实验任务 (19)四、思考题 (20)实验三、解线性方程组的直接法 (21)一、实验目的 (21)二、算法实例 (21)三、实验任务 (24)四、思考题 (24)实验四、解线性方程组的迭代法 (25)一、实验目的 (25)二、算法实例 (25)三、实验任务 (29)四、思考题 (29)实验五、常微分方程初值问题的数值解法 (30)一、实验目的 (30)二、算法实例 (30)三、实验任务 (40)四、思考题 (40)实验目的作为实践性非常强的课程,安排上机实验的目的,不仅是为了验证教材和授课内容,更重要的是,要通过实验深入理解方法的设计原理与处理问题的技巧,培养自行处理常规数值计算问题的能力和综合运用知识分析、解决问题的能力。

1、通过上机实验加深课堂内容的理解。

数值分析的主要任务就是研究适合于在计算机上使用的数值计算方法及与此相关的理论。

通过编程上机,就可以加深对方法运行过程的理解,同时在编程中领会和理解数值计算方法的计算要领和步骤,体会问题的条件和限制范围,理解一般问题和特殊问题的区别。

2、学会对数值计算结果的分析和处理。

数值分析实验不只是编写程序得到一个数值结果,我们应在掌握数值计算计算方法的基本原理和思想的同时,注意方法处理的技巧及其与计算机的密切结合,重视误差分析、收敛性及稳定性的讨论。

此外,还要注意算法能否在计算机上实现,应避免因数值方法选用不当、程序设计不合理而导致超过计算机的存储能力,或导致计算结果精度不高等。

3、要能灵活掌握各种数值计算方法。

由于针对同一个问题可以选用不同的数值计算方法,我们要注意各种方法的使用条件。

通过上机,比较各种方法间的异同及优缺点,以便更好的使用不同的方法来解决实际问题,使计算机成为我们最好的工具。

数值分析实验报告二2汇总

数值分析实验报告二2汇总
legend('数据点(xi,yi)','牛顿插值曲线y=f(x)');xlabel('x');ylabel('y');
title('数据点(xi,yi)和牛顿插值曲线y=f(x)的图形')
运行结果:
实验结果分析:
最小二乘法拟合的曲线误差最小。
也可以得到三图合一的图像:
在以上命令的基础上
运行命令plot(x1,y1,'r*',x,y,'b-',t,p1,'k-',x,P2,'y-')
% f积分函数
% a/b:积分上下限
% tol:积分误差
% R:Romberg积分值
% k:二分次数
k=1;
h=b-a;
%第一步
T(k,1)=h/2*(f(a)+f(b));
err=1;
whileerr>=eps
T(k,k)= Tห้องสมุดไป่ตู้k,1);
h=h/2;
%第二步求梯形值T0
temp=0;
i=1;
whilei<2^k
实验结果分析:
本题用了三种方法计算,虽然三种方法的结果差别不大,但得到结果的过程不同,每个方法都有其优缺点。
成绩评定
签字:年月日
-3002399751579999/9007199254740992*x^3-311/1125899906842624*x^2+4128299658423301/562949953421312*x-2533274790396013/281474976710656
拉格朗日插值
实验步骤:

《数值分析》课程实验报告数值分析实验报告

《数值分析》课程实验报告数值分析实验报告《数值分析》课程实验报告姓名:学号:学院:机电学院日期:20__ 年 _ 月_ 日目录实验一函数插值方法 1 实验二函数逼近与曲线拟合 5 实验三数值积分与数值微分 7 实验四线方程组的直接解法 9 实验五解线性方程组的迭代法 15 实验六非线性方程求根 19 实验七矩阵特征值问题计算 21 实验八常微分方程初值问题数值解法 24 实验一函数插值方法一、问题提出对于给定的一元函数的n+1个节点值。

试用Lagrange公式求其插值多项式或分段二次Lagrange插值多项式。

数据如下:(1) 0.4 0.55 0.65 0.80 0.95 1.05 0.41075 0.57815 0.69675 0.90 1.00 1.25382 求五次Lagrange多项式,和分段三次插值多项式,计算, 的值。

(提示:结果为, )(2) 1 2 3 4 5 6 7 0.368 0.135 0.050 0.018 0.007 0.002 0.001 试构造Lagrange多项式,计算的,值。

(提示:结果为, )二、要求 1、利用Lagrange插值公式编写出插值多项式程序;2、给出插值多项式或分段三次插值多项式的表达式;3、根据节点选取原则,对问题(2)用三点插值或二点插值,其结果如何;4、对此插值问题用Newton插值多项式其结果如何。

Newton 插值多项式如下:其中:三、目的和意义 1、学会常用的插值方法,求函数的近似表达式,以解决其它实际问题;2、明确插值多项式和分段插值多项式各自的优缺点;3、熟悉插值方法的程序编制;4、如果绘出插值函数的曲线,观察其光滑性。

四、实验步骤(1) 0.4 0.55 0.65 0.80 0.951.05 0.41075 0.57815 0.69675 0.90 1.00 1.25382 求五次Lagrange多项式,和分段三次插值多项式,计算, 的值。

数值分析实验二

b=polyfit(x,y,4);
x1=0.0:0.05:1.00;
>> y1=a(4)+a(3)*x1+a(2)*x1.^2+a(1)*x1.^3;
y2=b(5)+b(4)*x1+b(3)*x1.^2+b(2)*x1.^3+b(1)*x1.^4;
>> plot(x,y,'*');
>> hold on;
(1)掌握曲线拟合的最小二乘法;
(2)将函数逼近方法与插值法进行比较。
2.实验要求(由课任教师于实验开始前公布,不低于2行,不超过3行,由学生负责填写;5号字,行距20):
3.实验内容(由课任教师指明,由学生填写,不超出本页本栏):
1.对于给函数 在区间[-1,1]上取 =-1+0.2i(i=0,1,……,10),试求3次曲线拟合,试画出拟合曲线并打印出方程,与用插值法的结果比较。
>> plot(x1,y1,'-r')
>> y2=newton(x,y,x1);
>> hold on;
>> plot(x1,y2,'-')
2.>> y=[1.00 0.41 0.50 0.61 0.91 2.02 2.16];
>> x=[0.0 0.1 0.2 0.3 0.5 0.8 1.0];
>> a=polyfit(x,y,3);
2.由实验给出数据表
x
0.0
0.1
0.2
0.3
0.5
0.8
1.0
y
1.0
0.41

数值分析实验 实验报告

数值分析实验实验报告数值分析实验实验报告引言在现代科学与工程领域,数值分析是一项重要的技术手段。

通过数值方法,我们可以利用计算机模拟和解决各种实际问题,如物理、化学、生物、经济等领域中的方程求解、优化问题、数据拟合等。

本实验旨在通过实际案例,探讨数值分析的应用和效果。

实验一:方程求解首先,我们考虑一个简单的方程求解问题。

假设我们需要求解方程f(x) = 0的根,其中f(x)是一个在给定区间[a, b]上连续且单调的函数。

为了实现这个目标,我们可以采用二分法、牛顿法、弦截法等数值方法。

在本实验中,我们选择使用二分法来求解方程f(x) = 0。

这种方法的基本思想是通过不断缩小区间[a, b]的范围,直到找到一个近似的根。

我们首先选取一个中间点c,计算f(c)的值,然后根据f(c)与0的关系,将区间[a, b]分成两部分。

重复这个过程,直到找到满足精度要求的根。

实验二:数据拟合接下来,我们考虑一个数据拟合的问题。

假设我们有一组离散的数据点,我们希望找到一个函数,使得该函数与这些数据点的拟合误差最小。

为了实现这个目标,我们可以采用最小二乘法等数值方法。

在本实验中,我们选择使用最小二乘法来进行数据拟合。

这种方法的基本思想是通过最小化数据点与拟合函数之间的误差平方和,来确定拟合函数的参数。

我们首先选择一个拟合函数的形式,如线性函数、多项式函数等。

然后,通过最小化误差平方和的方法,计算出拟合函数的参数。

实验三:优化问题最后,我们考虑一个优化问题。

假设我们需要在给定的约束条件下,找到一个使得目标函数取得最大或最小值的变量。

为了实现这个目标,我们可以采用梯度下降法、遗传算法等数值方法。

在本实验中,我们选择使用梯度下降法来解决优化问题。

这种方法的基本思想是通过迭代的方式,不断调整变量的取值,直到找到一个满足约束条件的最优解。

我们首先计算目标函数关于变量的梯度,然后根据梯度的方向和大小,更新变量的取值。

通过不断迭代,我们可以逐步接近最优解。

数值分析实验报告(二)

数值分析实验报告(二)一.实验名称:简单迭代、牛顿迭代求非线性方程的根。

二.实验目的:运用简单迭代、牛顿迭代法求方程根。

三.题目:(1)用简单迭代法求2的近似值,要求误差小于410-。

(2)用牛顿迭代法求x^3-x^2-1=0,要求误差小于0.0000001。

四.程序:(1)简单迭代法#include<iostream.h>#include<math.h>double fun(double); //申明函数int main(){double x0,x,esp;int i=0;cout<<"输入初值x0=";cin>>x0;cout<<"输入迭代精度esp=";cin>>esp;do{x=x0;x0=fun(x0);i++;if(i>1000000){cout<<"迭代失败!!";return 0;}}while(fabs(x-x0)>esp);cout<<"迭代次数为"<<i<<endl;cout<<"迭代结果为"<<x<<endl;}double fun(double x) //定义函数{return 1/(x+2); //x(x+2)=1}(2)牛顿法#include < iostream.h>#include < math.h>#define f(x) (x*x*(x-1.0)-1.0) // 举例函数x^3-x^2-1 #define g(x) (3.0*x*x-2.0*x) // 导函数3x^2-2x#define epsilon 0.0000001 // 精度#define MAXREAPT 100bool RootNewton(double &x)double xk1,xk0;xk0=x;for(int k=0;k< MAXREAPT;k++ ){if(g(xk0)==0.0 ){cout <<"迭代过程中导数为0. " << endl;return false ;}xk1=xk0-f(xk0)/g(xk0);if(fabs(xk1-xk0)<epsilon&&fabs(f(xk1))<epsilon){x=xk1;return true;}else{xk0 = xk1;}}cout << " 迭代次数超过预期. " << endl;return false ;}int main()double x;cout << " 牛顿迭代法求方程根,请输入初始迭代x0值:";cin >> x;if(RootNewton(x)){cout << " 该值附近的根为: " << x << endl;}else{cout << " 迭代失败! " << endl;}return 0 ;}五.运行结果:(1)简单迭代法:(2)牛顿法:六.体会:牛顿法在单根附近有较快的收敛速度。

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

实验2.1(多项式插值的振荡现象)问题提出:考虑在一个固定的区间上用插值逼近一个函数。

显然拉格朗日插值中使用的节点越多,插值多项式的次数就越高。

我们自然关心插值多项式的次数增加时,()n L x 是否也更加靠近被逼近的函数,龙格给出的一个例子是极著名并富有启发性的,设区间[-1,1]上函数 21()125f x x =+实验内容:考虑区间[-1,1]的一个等距划分,分点为 21,0,1,2,...,i ix i n n=-+= 则拉格朗日插值多项式为 201()()125nn i i iL x l x x==+∑其中的(),0,1,2,...,i l x i n =是n 次拉格朗日插值基函数。

实验要求:(1)选择不断增大的分点数目2,3...,n =画出原函数()f x 及插值多项式函数()n L x 在 [-1,1]上的图像,比较并分析实验结果。

(2)选择其他的函数,例如定义在区间[-5,5]上的函数4(),()arctan 1xh x g x x x==+ 重复上述的实验看其结果如何。

(3)区间[a,b]上切比雪夫点的定义为(21)cos ,1,2,...,1222(1)k a b b ak x k n n π⎛⎫+--=+=+ ⎪+⎝⎭以121,,...,n x x x +为插值节点构造上述各函数的拉格朗日插值多项式,比较其结果。

程序清单:1. 被逼近函数的函数文件func1.mfunction y=func1(x,c)%直接用被逼近函数计算函数值,c 用来选择函数 if c==1;y=1./(1+25*x.^2); end; if c==2;y=x./(1+x.^4); end; if c==3;y=atan(x);end;2.拉格朗日插值函数文件lagr.mfunction yy=lagr(x,y,xx)%用拉格朗日插值多项式进行插值,x为插值点的自变量列阵,y为对应的函数值列阵,xx为%待插值的自变量列阵,yy为求得的对应于xx的函数值列阵yy=xx-xx;%初始化为0向量n=length(x)-1;for i=0:n;z=yy;k=0;for j=0:n;if j~=ik=k+1;if k==1;z=(xx-x(j+1))/(x(i+1)-x(j+1));elsez=z.*(xx-x(j+1))/(x(i+1)-x(j+1));end;end;end;yy=yy+z*y(i+1);end;2.主程序main1.mm=input('请输入节点数目:');chof=input('请选择函数:(1:1/(1+25*x^2)) 2:x/(1+x^4) 3:arctanx)');div=input('请选择节点方式:(1.均布节点2.切比雪夫点)');%生成用于画图的自变量序列if chof==1;t=-1:0.01:1;else;t=-5:0.01:5;end;y1=func1(t,chof);%直接求t对应的函数值%按要求构造节点的自变量序列n=m-1;for i=0:n;if div==1;if chof==1;nod(i+1)=-1+2*i/n;else;nod(i+1)=-5+10*i/n;end;end;if div==2;if chof==1;nod(i+1)=cos((2*i+1)*pi/(2*(n+1))); elsenod(i+1)=5*cos((2*i+1)*pi/(2*(n+1))); end; end; end;nodv=func1(nod,chof);%求节点处函数值 y=lagr(nod,nodv,t); plot(t,y1,t,y); t=0; y=0; y1=0; nod=0; nodv=0;实验结果及其分析:(1) 分点数分别为2,3,5,8,11,15时的函数21()125f x x =+和插值多项式函数()n L x 的图像如下:n=2: n=3n=5: n=8:n=11: n=15:分析:从图上可以看出随着分点数目的增加区间端部的插值函数的值与原函数的误差越来达,而区间中部的误差越来越小,这就是所谓的龙格现象,这是等距节点的高次插值多项式的典型病态现象。

(2) 对于函数4()1xh x x =+情况如下: n=4: n=8:n=11: n=15:对于函数()arctan g x x =情况如下:n=3: n=7:n=11: n=15:分析:从图上可以看出对于上面这两种函数也有龙格现象出现。

(3) 若采用切比雪夫点则结果如下:21()125f x x =+:n=11: n=15:4()1xh x x =+: n=11: n=20:()arctan g x x =:n=11:分析:采用切比雪夫点有效的抑制了龙格现象,由于切比雪夫点在区间的端部较为密集而在区间中部较为稀疏,因此它有利于减小端部的误差,防止发生龙格现象。

实验2.3 (曲线逼近方法的比较)问题提出:曲线的拟合和插值,是逼近函数的基本方法,每种方法具有各自的特点和特定的适用范围,实际工作中合理选择方法是重要的。

实验内容:任然考虑实验2.1中的著名问题,用Matlab程序给出了该函数的二次和三次拟合多项式。

实验要求:(1)将拟合的结果与拉格朗日插值及样条插值的结果比较。

(2)归纳总结数值实验的结果,试定性地说明函数逼近各种方法的适用范围,及实际应用中选择方法应注意的问题。

程序清单:x=-1:0.2:1;y=1./(1+25*x.*x);xx=-1:0.02:1;%多项式拟合p2=polyfit(x,y,3);yy=polyval(p2,xx);plot(x,y,'o',xx,yy);xlabel('x');ylabel('y');hold on;%拉格朗日插值yy=lagr(x,y,xx);plot(xx,yy,'b');%样条插值yy=spline(x,y,xx);plot(xx,yy,'r');hold off;当需要分别画各种方法的图时,可对上面的程序进行相应的修改。

实验结果及其分析:对于实验2.1中的著名问题用各种逼近方法得到的结果分别如下:二次多项式拟合:六次多项式拟合:拉格朗日插值:三次样条插值:分析:从结果来看三次多项式拟合结果不理想,六次多项式拟合在中部稍好而在端部不理想, 拉格朗日插值在端部出现龙格现象,三次样条曲线拟合的结果较为理想。

(3) 曲线拟合适用于曲线不要求通过每一个数据点而只需反映数据点的分布趋势的情况,对于曲线拟合重要的是选好模型,例如前面的情况用多项式模型就不太合适,因此效果不理想。

而拉格朗日插值适用于严格要求曲线过每一个数据点,且在整个逼近区间上要求有一个统一表达式的情形,它的缺点是当通过的点数增多且点的分布不能满足一定要求时会出现龙格现象,此时在区间中部逼近较理想,端部的情况则往往很坏。

样条曲线插值适合于严格要求曲线过每个数据点,点数较多的情形,也就是拉格朗日插值不适用的情形。

它的适用范围较广,经常采用。

实验2.5 (高维积分数值计算的蒙特卡罗方法)问题提出:高维空间中的积分,如果维数不很高且积分区域是规则的或者能等价地写成多重积分的形式,可以用一元函数积分的数值方法来计算高维空间的积分。

蒙特卡罗方法对计算复杂区域甚至不连通的区域上的积分并没有特殊的困难。

实验内容:对于一般的区域Ω,计算其测度(只要理解为平面上的面积或空间中的体积)的一般方法是:先找一个规则的区域A 包含Ω,且A 的测度是已知的。

生成区域A 中m 个均匀分布的随机点,1,2,...,,i p i m =如果其中有n 个落在区域Ω中,则区域Ω的测度()m Ω为n/m 倍A 的测度。

函数()f x 在区域Ω上的积分可以近似为:区域Ω的测度与函数()f x 在Ω中n 个随机点上平均值的乘积。

1()()()k k p f x dx m f p nΩ∈Ω≈Ω⨯∑⎰实验要求:假设冰激凌的下部为一锥体而上面为一半球,考虑冰激凌体积问题:计算锥面222z x y =+上方和球面222(1)1x y z ++-=内部区域的体积。

如果使用球面坐标,该区域可以表示为如下的积分:2cos /422sin d d d ϕππρϕϕρθ⎰⎰⎰用蒙特卡罗方法可以计算该积分。

另一方面,显然这样的冰激凌可以装在如下立方体的盒子里 11,11,02x y z -≤≤-≤≤≤≤而该立方体的体积为8。

只要生成这个盒子里均匀分布的随机点,落入冰激凌锥点的个数与总点数之比再乘以8就是冰激凌锥的体积。

比较两种方法所得到的结果。

类似的方法可以计算复杂区域的测度(面积或体积)。

试求由下列关系所界定区域的测度:01,12,13(1)sin()0xx y z e y z y ≤≤≤≤-≤≤⎧⎪≤⎨⎪≥⎩33213,14(2)29201,01,01(3)sin 1x y x y x y y e x y z x y z x z e ≤≤-≤≤⎧⎪+≤⎨⎪≥-⎩≤≤≤≤≤≤⎧⎪+≤⎨⎪-+≤⎩程序清单:1. 计算冰激凌的体积n=input('请输入生成的随机点的数目:'); m=0; for i=1:n;p=rand(1,3); x=-1+2*p(1); y=-1+2*p(2); z=2*p(3);if x^2+y^2+(z-1)^2<1&x^2+y^2<z^2; m=m+1; end; end; 8*m/n2.(1)区域的测度n=input('请输入生成的随机点的数目:'); m=0; for i=1:n;p=rand(1,3); x=p(1); y=1+p(2); z=-1+4*p(3);if exp(x)<=y&sin(z)*y>=0; m=m+1;end;end;8*m/n3.(2)区域的测度n=input('请输入生成的随机点的数目:'); m=0;for i=1:n;p=rand(1,2);x=1+2*p(1);y=-1+5*p(2);if x^3+y^3<=29&exp(x)-2<=y;m=m+1;end;end;10*m/n4.(3)区域的测度n=input('请输入生成的随机点的数目:'); m=0;for i=1:n;p=rand(1,3);x=p(1);y=p(2);z=p(3);if x^2+sin(y)<=z&x-z+exp(y)<=1;m=m+1;end;end;m/n实验结果及其分析:(1)直接积分算得冰激凌的体积为。

相关文档
最新文档