数值方法上机作业

合集下载

数值方法分析 吉林大学 上机题答案 c语言

数值方法分析 吉林大学 上机题答案 c语言

《数值计算方法》上机作业第二章 问题:1.编制通用程序,对n+1个节点i x 及()i i y f x = (0,,)i n = (1)n 次拉格朗日插值计算公式Ln(x); (2)n 次牛顿向前插值计算公式; (3)n 次牛顿向后插值计算公式;2.已知()ln ,[,][1,2]f x x a b ==,取0.1,1,0,1,,10.i h x ih i ==+= 用通用程序计算ln1.54及ln1.98的近似值。

第一个程序:n 次拉格朗日插值计算公式Ln(x) (1) 流程图(2)编程源文件:#include <stdio.h>#include <math.h>void main(){float x[100],y[100],x1;int n,i,j;//输入插值点printf("Please enter the interpolating point x1:");scanf("%f",&x1);//输入拟合阶数printf("Enter the order n:");scanf("%d",&n);//输入插值节点printf("Please input numbers x[i],y[i]:\n");for(i=0;i<=n;i++)scanf("%f,%f",&x[i],&y[i]);float sum=0;float fenzi=1,fenmu=1; //fenzi为基函数的分子,fenmu为基函数的分母for(i=0;i<=n;i++){fenzi=1;fenmu=1;for(j=0;j<=n;j++)if(i==j) {fenzi*=1;fenmu*=1;} //当i=j时,分子分母不乘任何项 else {fenzi=fenzi*(x1-x[j]);fenmu=fenmu*(x[i]-x[j]);}//否则,分子自乘x-xj,分母自乘xi-xjsum=sum+fenzi/fenmu*y[i]; }//sum自加(x-xj)/(xi-xj)*yjprintf("The result caculated using Lagrange interpolation mathod is:\n%f\n",sum);}(3)运算结果:Ln1.54=0.431783Ln1.98=0.683092第二个程序:n次牛顿向前插值计算公式(1)流程图见下页(2)源程序:#include <stdio.h>#include <math.h>void main(){float x[100],y[100],x1,h;int n,i,j;//输入插值点printf("Please enter the interpolating point x1:"); scanf("%f",&x1);//输入拟合阶数printf("Enter the order n:");scanf("%d",&n);//输入插值步长printf("Enter the step size h:");scanf("%f",&h);//输入插值节点printf("Please input numbers x[i],y[i]:\n");for(i=0;i<=n;i++)scanf("%f,%f",&x[i],&y[i]);float sum=0,t;float dif[80][80];float fenzi=1,fenmu=1;//fenzi为分子t(t-1)...(t-n+1)//fenmu为分母(n+1)!//计算步长hh=(x[n]-x[0])/n;//计算tt=(x1-x[0])/h;//构造向前差分表for(i=0;i<=n;i++)dif[0][i]=y[i];for(i=1;i<=n;i++)for(j=0;j<=n-i;j++)dif[i][j]=dif[i-1][j+1]-dif[i-1][j];sum=y[0];//计算插值公式for(i=1;i<=n;i++){fenzi=1;fenmu=1;for(j=1;j<=i;j++){fenzi*=(t-j+1);fenmu*=j;}sum+=dif[i][0]*fenzi/fenmu;}printf("The result caculated using Netown forward interpolation mathod is:\n%f\n",sum);}(3)运行结果Ln1.54=0.431783Ln1.98=0.683092第三个程序:n次牛顿向后插值计算公式(1(2)源程序#include <stdio.h>#include <math.h>void main(){float x[100],y[100],x1,h;int n,i,j;//输入插值点printf("Please enter the interpolating point x1:");scanf("%f",&x1);//输入拟合阶数printf("Enter the order n:");scanf("%d",&n);//输入插值步长printf("Enter the step size h:");scanf("%f",&h);//输入插值节点printf("Please input numbers x[i],y[i]:\n");for(i=0;i<=n;i++)scanf("%f,%f",&x[i],&y[i]);float sum=0,t;float dif[80][80];float fenzi=1,fenmu=1;//fenzi为分子t(t+1)...(t+n-1)//fenmu为分母n!//计算步长h=(x[n]-x[0])/n;//计算tt=(x1-x[n])/h;//构造向后差分表for(i=0;i<=n;i++)dif[0][i]=y[i];for(i=1;i<=n;i++)for(j=n;j>=i;j--)dif[i][j]=dif[i-1][j]-dif[i-1][j-1];sum=y[n];//计算插值公式for(i=1;i<=n;i++){fenzi=1;fenmu=1;for(j=1;j<=i;j++){fenzi*=(t+j-1);fenmu*=j;}sum+=dif[i][n]*fenzi/fenmu;}printf("The result caculated using Netown backward interpolation mathod is:\n%f\n",sum);}(3)运行结果Ln1.54=0.431783Ln1.98=0.683092形成的插值曲线在两端点附近的震荡非常剧烈,这种现象称为龙格现象,这表明不能完全通过提高多项式次数的办法来更好的逼近f(x),并不像理论上的等分数越大,插值多项式次数越高,误差就应越小,精度就应越高,另外,插值多项式的次数越高,计算工作量就越大,累计误差也越大,因此,在实际计算中,应采用分段低次插值的方法。

数值分析大作业

数值分析大作业

数值分析上机作业(一)一、算法的设计方案1、幂法求解λ1、λ501幂法主要用于计算矩阵的按模最大的特征值和相应的特征向量,即对于|λ1|≥|λ2|≥.....≥|λn|可以采用幂法直接求出λ1,但在本题中λ1≤λ2≤……≤λ501,我们无法判断按模最大的特征值。

但是由矩阵A的特征值条件可知|λ1|和|λ501|之间必然有一个是最大的,通过对矩阵A使用幂法迭代一定次数后得到满足精度ε=10−12的特征值λ0,然后在对矩阵A做如下的平移:B=A-λ0I由线性代数(A-PI)x=(λ-p)x可得矩阵B的特征值为:λ1-λ0、λ2-λ0…….λ501-λ0。

对B矩阵采用幂法求出B矩阵按模最大的特征值为λ∗=λ501-λ0,所以λ501=λ∗+λ0,比较λ0与λ501的大小,若λ0>λ501则λ1=λ501,λ501=λ0;若λ0<λ501,则令t=λ501,λ1=λ0,λ501=t。

求矩阵M按模最大的特征值λ的具体算法如下:任取非零向量u0∈R nηk−1=u T(k−1)∗u k−1y k−1=u k−1ηk−1u k=Ay k−1βk=y Tk−1u k(k=1,2,3……)当|βk−βk−1||βk|≤ε=10−12时,迭终终止,并且令λ1=βk2、反幂法计算λs和λik由已知条件可知λs是矩阵A 按模最小的特征值,可以应用反幂法直接求解出λs。

使用带偏移量的反幂法求解λik,其中偏移量为μk=λ1+kλ501−λ140(k=1,2,3…39),构造矩阵C=A-μk I,矩阵C的特征值为λik−μk,对矩阵C使用反幂法求得按模最小特征值λ0,则有λik=1λ0+μk。

求解矩阵M按模最小特征值的具体算法如下:任取非零向量u 0∈R n ηk−1= u T (k−1)∗u k−1y k−1=u k−1ηk−1 Au k =y k−1βk =y T k−1u k (k=1,2,3……)在反幂法中每一次迭代都要求解线性方程组Au k =y k−1,当K 足够大时,取λn =1βk 。

数值分析报告上机题课后作业全部-东南大学

数值分析报告上机题课后作业全部-东南大学

实用标准文案文档大全上机作业题报告2015.1.9 USER1.Chapter 11.1题目设S N =∑1j 2−1N j=2,其精确值为)11123(21+--N N 。

(1)编制按从大到小的顺序11131121222-+⋯⋯+-+-=N S N ,计算S N 的通用程序。

(2)编制按从小到大的顺序1211)1(111222-+⋯⋯+--+-=N N S N ,计算S N 的通用程序。

(3)按两种顺序分别计算64210,10,10S S S ,并指出有效位数。

(编制程序时用单精度) (4)通过本次上机题,你明白了什么?1.2程序1.3运行结果1.4结果分析按从大到小的顺序,有效位数分别为:6,4,3。

按从小到大的顺序,有效位数分别为:5,6,6。

可以看出,不同的算法造成的误差限是不同的,好的算法可以让结果更加精确。

当采用从大到小的顺序累加的算法时,误差限随着N 的增大而增大,可见在累加的过程中,误差在放大,造成结果的误差较大。

因此,采取从小到大的顺序累加得到的结果更加精确。

2.Chapter 22.1题目(1)给定初值0x 及容许误差ε,编制牛顿法解方程f(x)=0的通用程序。

(2)给定方程03)(3=-=x xx f ,易知其有三个根3,0,3321=*=*-=*x x x○1由牛顿方法的局部收敛性可知存在,0>δ当),(0δδ+-∈x 时,Newton 迭代序列收敛于根x2*。

试确定尽可能大的δ。

○2试取若干初始值,观察当),1(),1,(),,(),,1(),1,(0+∞+-----∞∈δδδδx 时Newton 序列的收敛性以及收敛于哪一个根。

(3)通过本上机题,你明白了什么?2.2程序2.3运行结果(1)寻找最大的δ值。

算法为:将初值x0在从0开始不断累加搜索精度eps,带入Newton迭代公式,直到求得的根不再收敛于0为止,此时的x0值即为最大的sigma值。

运行Find.m,得到在不同的搜索精度下的最大sigma值。

数值方法上机作业

数值方法上机作业

数值计算方法上机作业(C++版)2008-12-01第二章插值法上机作业一、编制通用程序对n+1个节点xi及yi=f(xi)(i=1,……,n)(1)n次拉格朗日插值计算公式Ln(x);(2)n次牛顿向前插值计算公式;(3)n次牛顿向后插值计算公式。

定义头文件:interpolate.h#ifndef INTERPOTA TE_H_H#define INTERPOTA TE_H_Husing namespace std;const int Zero = 1e-6;bool LagrangeInterpolate(const int n, double *x, double *y, double intervalue, double *result_x); bool NewtonFront(const int n, double *x, double *y, double intervalue, double *result_x);bool NewtonBack(const int n, double *x, double *y, double intervalue, double *result_x);#endif1.拉格朗日插值子程序流程图及程序:#include <iostream>#include <iomanip>#include <math.h>#include "Interpolate.h"using namespace std;bool LagrangeInterpolate(const int n, double *x, double *y, double intervalue, double *result_x) {int i,j,k;double Vandermonde = 1.0;*result_x = 0.0;for(k=0; k<=n; ++k){Vandermonde = 1.0;for(i=0; i<=n; ++i){if(i != k){Vandermonde = ( (intervalue - x[i]) / (x[k] - x[i]) ) * Vandermonde;}}*result_x = *result_x + Vandermonde * y[k];}cout<<"Interpolate at X = "<<setiosflags(ios::fixed | ios::showpoint)<<setw(10) <<intervalue<<" =====>> "<<setw(10)<<*result_x<<endl;return true;}12.牛顿向前插值子程序流程图及程序#include <iostream>#include <iomanip>#include <math.h>#include "Interpolate.h"bool NewtonFront(const int n, double *x, double *y, double intervalue, double *result_x) {int i,j;int begin = 0;int N =n;double t = 0.0;double mult_t =1.0; //=====存放t多项式乘积,阶乘double temp1 = 0.0;double temp2 = 0.0;//=========计算出插值的X0,确定插值次数N==========//2for(i=0; i<=n; ++i){if(intervalue - x[i] < 0){begin = i - 1;N = n - begin;t = (intervalue - x[begin]) / (x[1] - x[0]);break;}else if( fabs(intervalue - x[i]) < Zero ){*result_x = y[i];cout<<"Interpolate at X = "<<setiosflags(ios::fixed | ios::showpoint)<<setw(10) <<intervalue<<" =====>> "<<setw(10)<<*result_x<<endl;return true;}}//=========开始插值初始化========================//double * X = new double[N+1];double * Y = new double[N+1];double * difference_table = new double[N+1];for(i=begin; i<=n; ++i){X[i-begin] = x[i];Y[i-begin] = y[i];difference_table[i-begin] = y[i];}//==========开始插值计算========================//*result_x = 0.0;for(i=0; i<=N; ++i){//==============计算差分表=================//temp2 = difference_table[i];for(j=i+1; j<=N; ++j){temp1 = difference_table[j];difference_table[j] = difference_table[j] - temp2;temp2 = temp1;}//==============计算阶乘和多项式===========//if(i){mult_t = mult_t * ( (t - i + 1) / i );}*result_x = *result_x + mult_t * difference_table[i];}cout<<"Interpolate at X = "<<setiosflags(ios::fixed | ios::showpoint)<<setw(10) <<intervalue<<" =====>> "<<setw(10)<<*result_x<<endl;delete [] X;delete [] Y;delete [] difference_table;return true;}343.牛顿向后插值子程序流程图及程序#include <iostream>#include <iomanip>#include <math.h>#include "Interpolate.h"bool NewtonBack(const int n, double *x, double *y, double intervalue, double *result_x){int i,j;int end = 0;int N =n;double t = 0.0;double mult_t =1.0; //=====存放t多项式乘积,阶乘double temp1 = 0.0;double temp2 = 0.0;//=========计算出插值的X0,确定插值次数N==========//for(i=n; i>=0; --i){if(intervalue - x[i] > 0){end = i + 1;N = end;t = (intervalue - x[end]) / (x[1] - x[0]);break;}else if( fabs(intervalue - x[i]) < Zero ){*result_x = y[i];cout<<"Interpolate at X = "<<setiosflags(ios::fixed | ios::showpoint)<<setw(10) <<intervalue<<" =====>> "<<setw(10)<<*result_x<<endl;return true;}}//=========开始插值初始化========================//double * X = new double[N+1];double * Y = new double[N+1];double * difference_table = new double[N+1];for(i=0; i<=N; ++i){X[i] = x[i];Y[i] = y[i];difference_table[i] = y[i];}//==========开始插值计算========================//*result_x = 0.0;for(i=N; i>=0; --i){//==============计算差分表=================//temp2 = difference_table[i];for(j=i-1; j>=0; --j){temp1 = difference_table[j];difference_table[j] = temp2 - difference_table[j];temp2 = temp1;}5//==============计算阶乘和多项式===========//if(N-i){mult_t = mult_t * ( (t + (N - i) - 1) / (N - i) );}*result_x = *result_x + mult_t * difference_table[i];}cout<<"Interpolate at X = "<<setiosflags(ios::fixed | ios::showpoint)<<setw(10) <<intervalue<<" =====>> "<<setw(10)<<*result_x<<endl;delete [] X;delete [] Y;delete [] difference_table;return true;}678二、计算1.已知f (x )=lnx ,[a ,b]=[1,2],取h =0.1,xi =1+ih ,i=0,1,……,10。

数值计算上机作业

数值计算上机作业

西南交通大学数值计算课程上机作业组号第1组组员学号班级任课教师2017年12月10日目录第1题........................................................................................................ 错误!未定义书签。

1.1 (a) ..................................................................................................... 错误!未定义书签。

1.2 (b) ..................................................................................................... 错误!未定义书签。

第2题. (1)2.1 (a)................................................................................................. 错误!未定义书签。

2.2 (b) ................................................................................................ 错误!未定义书签。

第3题. (1)第4题 (2)4.1 (a)................................................................................................. 错误!未定义书签。

4.2 (b) ................................................................................................ 错误!未定义书签。

数值计算方法上机题目资料

数值计算方法上机题目资料
,在程序设计时要充分 考虑哪些变量应该可变的。
2. 程序输入、输出用文件形式。 3. 编程语言要求用C, 编程环境TC或VC 4. 程序要求调试通过。 5. 每个方法要求给出一个具体的算例(可选
作业题)来验证。
五、上机报告要求
1.报告内容包括:
每种方法的算法原理及程序框图。 程序使用说明 具体算例及结果
上机调试体会及收获。
2.报告要手写。
六、上机报告及源程序提交时间
1.上机报告在考试当天提交。 2.源程序在考试前提交。
提交格式:文件夹(班级+姓名)
输入文件 程序文件夹 输出文件
不要拷贝其它文件!!! 源程序
六、上机报告及源程序提交时间
源程序提交: 把以上文件压缩后,发送到以下邮箱:
haoyq@
七、考核方式
1.算法手算笔试(80%)+上机内容笔试 (10%)+上机报告(10%)
2.上机内容笔试可能形式:
编一段算法程序 给出一段算法程序,说明算法的名称。 程序填空 程序改错(包括算法和语法的错误)
数值计算方法上机练习
一、上机练习目的
复习和巩固数值计算方法的基本数学模型, 全面掌握运用计算机进行数值计算的具体 过程及相关问题。
利用计算机语言独立编写、调试数值计算 方法程序,培养学生利用计算机和所学理 论知识分析解决实际问题的能力。
二、上机练习任务
• 利用计算机基本C语言编写并调试一系列 数值方法计算通用程序,并能正确计算给 定题目,掌握调试技能。
• 掌握文件使用编程技能,如文件的各类操 作,数据格式设计、通用程序运行过程中 文件输入输出运行方式设计等。
• 写出上机练习报告。
三、数值计算方法上机题目

数值计算方法上机实习题

数值计算方法上机实习题

数值计算方法上机实习题1. 设⎰+=105dx xx I nn , (1) 由递推公式nI I n n 151+-=-,从, 0=0.1823I 出发,计算20I ;(2) 20=0I ,20=10000I , 用nI I n n 515111+-=--,计算0I ;(3) 分析结果的可靠性及产生此现象的原因(重点分析原因)。

答:第一个算法可得出易知第一个算法每一步计算都把误差放大了5倍,n 次计算后更是放大了5n 倍,可靠性低。

第二个算法可得出可以看出第二个算法每一步计算就把误差缩小5倍,n 次后缩小了5n 倍,可靠性高。

2. 求方程0210=-+x e x的近似根,要求41105-+⨯<-k k x x ,并比较计算量。

(1) 在[0,1]上用二分法; root=0.09057617 ,n=11(2) 取初值00=x ,并用迭代1021x k e x -=+;(3) 加速迭代的结果;(4) 取初值00 x ,并用牛顿迭代法;(5)分析绝对误差。

答:可以看到,在同一精度下,二分法运算了11次,题设迭代算式下运算了4次,加速迭代下运算了2次,牛顿迭代下运算了2次。

因不动点迭代法和二分法都是线性收敛的,但二分法压缩系数比题设迭代方法大,收敛速度较慢。

加速迭代速度是超线性收敛,牛顿法是二阶,收敛速度快。

3.钢水包使用次数多以后,钢包的容积增大,数据如下:试从中找出使用次数和容积之间的关系,计算均方差。

(用ax byc x+=+拟合)指标选择,因题设方程4.设⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛----------------=410100141010014101101410010141001014A ,⎪⎪⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛--=625250b ,b x =A分析下列迭代法的收敛性,并求42110-+≤-k k x x 的近似解及相应的迭代次数。

(2) GAUSS-SEIDEL 迭代;5.用逆幂迭代法求⎪⎪⎪⎭⎫ ⎝⎛=111123136A 最接近于11的特征值和特征向量,准确到310-。

数值分析上机作业最强版

数值分析上机作业最强版

数值分析上机作业姓名:唐皓学号:142460专业:道路与铁道工程院系:交通学院授课教师:吴宏伟日期:2015年1月习题一1 题目17.(上机题)舍入误差与有效数 设2211NN j S j ==-∑,其精确值为1311221N N ⎛⎫-- ⎪+⎝⎭。

(1)编制按从大到小的顺序22211121311N S N =+++---,计算N S 的通用程序; (2)编制按从小到大的顺序2221111(1)121N S N N =+++----,计算N S 的通用程序; (3)按两种顺序分别计算210S ,410S ,610S ,并指出有效位数。

(编制程序时用单精度);(4)通过本上机题你明白了什么?2 通用程序代码2.1 按从小到大的顺序计算N Svoid AscendSum(unsigned long int N)// 计算从大到小的总和 {for (unsigned long int j=2;j<=N;j++) ascendSum+=(float )1.0/(j*j-1);cout<<"Sum From 1 to N (Ascend) is: "<<ascendSum<<endl; Error(ascendSum); Delimiter();} 2.2 按从大到小的顺序计算N Svoid DescendSum(unsigned long int N)//计算从小到大的总和 {for (unsigned long int j=N;j>=2;j--) descendSum+=(float )1.0/(j*j-1);cout<<"Sum From N to 1 (Descend) is: "<<descendSum<<endl; Error(descendSum); Delimiter();}3计算结果展示图1 N=100时的计算结果图2 N=10000时的计算结果图3 N=1000000时的计算结果表1-1 计算结果汇总N S 精确值按从小到大按从大到小N S 值有效位数 N S 值有效位数210S 0.7400494814 0.7400494814 10 0.740049541 6 410S 0.7498999834 0.7498521209 4 0.7498999834 10 610S0.74999898670.75185602920.752992510824 计算结果分析(1)如果采用单精度数据结构进行计算,则相较于双精度的数据结果,由于数据存储字长的限制导致计算机存在较大的舍入误差,因此本程序采用的是双精度数据存储方式。

数值计算方法上机实习题答案.doc

数值计算方法上机实习题答案.doc

1.设I n 1 x ndx ,0 5 x( 1)由递推公式 I n 5I n 11,从 I 0的几个近似值出发,计算I 20;n解:易得: I 0 ln6-ln5=0.1823, 程序为:I=0.182;for n=1:20I=(-5)*I+1/n;endI输出结果为: I 20= -3.0666e+010( 2)粗糙估计 I 20,用 I n 1 1I n 1 1 ,计算 I 0;5 5n0.0079 1 x 20 1 x 200.0095因为dx I 20dx 6 5所以取 I 20 1(0.0079 0.0095) 0.0087 2程序为: I=0.0087;for n=1:20I=(-1/5)*I+1/(5*n);endII 0= 0.0083( 3)分析结果的可靠性及产生此现象的原因(重点分析原因 )。

首先分析两种递推式的误差;设第一递推式中开始时的误差为E0 I 0 I 0,递推过程的舍入误差不计。

并记 E n I n I n,则有 E n 5E n 1 ( 5) n E0。

因为 E20( 5) 20 E0 I 20,所此递推式不可靠。

而在第二种递推式中E0 1E1 (1)n E n,误差在缩小,5 5所以此递推式是可靠的。

出现以上运行结果的主要原因是在构造递推式过程中,考虑误差是否得到控制,即算法是否数值稳定。

2.求方程e x10x 2 0 的近似根,要求x k 1x k 5 10 4,并比较计算量。

(1)在 [0, 1]上用二分法;程序: a=0;b=1.0;while abs(b-a)>5*1e-4c=(b+a)/2;if exp(c)+10*c-2>0b=c;else a=c;endendc结果: c =0.0903( 2)取初值x0 0,并用迭代 x k 1 2 e x ;10程序: x=0;a=1;while abs(x-a)>5*1e-4a=x;x=(2-exp(x))/10;endx结果: x =0.0905(3)加速迭代的结果;程序: x=0;a=0;b=1;while abs(b-a)>5*1e-4a=x;y=exp(x)+10*x-2;z=exp(y)+10*y-2;x=x-(y-x)^2/(z-2*y+x);b=x;endx结果: x =0.0995( 4)取初值x00 ,并用牛顿迭代法;程序: x=0;a=0;b=1;while abs(b-a)>5*1e-4a=x;x=x-(exp(x)+10*x-2)/(exp(x)+10); b=x;end x 结果: x =0.0905( 5) 分析绝对误差。

数值分析上机作业1-1解析

数值分析上机作业1-1解析

数值计算方法上机题目11、实验1. 病态问题实验目的:算法有“优”与“劣”之分,问题也有“好”和“坏”之别。

所谓坏问题就是问题本身的解对数据变化的比较敏感,反之属于好问题。

希望读者通过本实验对此有一个初步的体会。

数值分析的大部分研究课题中,如线性代数方程组、矩阵特征值问题、非线性方程及方程组等都存在病态的问题。

病态问题要通过研究和构造特殊的算法来解决,当然一般要付出一些代价(如耗用更多的机器时间、占用更多的存储空间等)。

问题提出:考虑一个高次的代数多项式∏=-=---=201)()20)...(2)(1()(k k x x x x x p (E1-1)显然该多项式的全部根为l ,2,…,20,共计20个,且每个根都是单重的(也称为简单的)。

现考虑该多项式方程的一个扰动0)(19=+xx p ε (E1-2)其中ε是一个非常小的数。

这相当于是对(E1-1)中19x 的系数作一个小的扰动。

我们希望比较(E1-1)和(E1-2)根的差别,从而分析方程(E1-1)的解对扰动的敏感性。

实验内容:为了实现方便,我们先介绍两个 Matlab 函数:“roots ”和“poly ”,输入函数u =roots (a )其中若变量a 存储1+n 维的向量,则该函数的输出u 为一个n 维的向量。

设a 的元素依次为121,...,,+n a a a ,则输出u 的各分量是多项式方程0...1121=++++-n n n n a x a x a x a的全部根,而函数b=poly(v)的输出b 是一个n +1维变量,它是以n 维变量v 的各分量为根的多项式的系数。

可见“roots ”和“Poly ”是两个互逆的运算函数.ve=zeros(1,21); ve(2)=ess;roots(poly(1:20))+ve)上述简单的Matlab 程序便得到(E1-2)的全部根,程序中的“ess ”即是(E1-2)中的ε。

实验要求:(1)选择充分小的ess ,反复进行上述实验,记录结果的变化并分析它们。

数值分析上机作业(2)

数值分析上机作业(2)

一、数值求解如下正方形域上的Poisson 方程边值问题 2222(,)1,0,1(0,)(1,)(1),01(,0)(,1)0,01u u f x y x y x y u y u y y y y u x u x x ⎧⎛⎫∂∂-+==<<⎪ ⎪∂∂⎪⎝⎭⎨==-≤≤⎪⎪==≤≤⎩二、用椭圆型第一边值问题的五点差分格式得到线性方程组为2,1,1,,1,10,1,,0,141,?,?,?,?0,1i j i j i j i j i j ijj N j i i N u u u u u h f i j N u u u u i j N -+-+++----=≤≤====≤≤+, 写成矩阵形式Au=f 。

其中1.三 、编写求解线性方程组Au=f 的算法程序, 用下列方法编程计算, 并比较计算速度。

2.用Jacobi 迭代法求解线性方程组Au=f 。

3.用块Jacobi 迭代法求解线性方程组Au=f 。

4. 用SOR 迭代法求解线性方程组Au=f,用试算法确定最佳松弛因子。

1122N N v b v b u f v b ⎛⎫⎛⎫ ⎪ ⎪ ⎪ ⎪== ⎪ ⎪ ⎪ ⎪⎝⎭⎝⎭4114114ii A -⎛⎫ ⎪- ⎪= ⎪- ⎪-⎝⎭11,12,1,121,22,2,21,2,,2211,12,1,121,22,2,221,2,,(,,...,),(,,...,),......,(,,...,)(,,...,)?,(,,...,)?,......,(,,...,)?1,999,0.10.011T T N N TN N N N N T T N N T N N N N N v u u u v u u u v u u u b h f f f b h f f f b h f f f h N h N ====+=+=+===+取或则或,1,,1,2,...,i j f i j N== 1122NN A I I A A I I A -⎛⎫ ⎪- ⎪= ⎪- ⎪-⎝⎭5.用块SOR 迭代法求解线性方程组Au=f,用试算法确定最佳松弛因子。

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

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

数值计算方法上机实验报告1华北电力大学上机实验报告课程名称:数值计算方法专业班级:学生姓名:学号:指导教师:张建成实验目的:复习和巩固数值计算方法的基本数学模型,全面掌握运用计算机进行数值计算的具体过程及相关问题。

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

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

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

一、列主元素消去法求解线性方程组 1、算法原理为避免绝对值很小的元素作为主元,在每次消元之前增加一个选主元的过程,将绝对值大的元素交换到主对角线的位置。

列主元素消元法是当变换到第k 步时,从k 列的kk a 及以下的各元素中选取绝对值最大的元素,然后通过二交换将其交换到kk a 的位置上。

2、输入输出变量ija :为系数矩阵的各个系数K :表示到第k 步消元 3、具体算例输入增广矩阵为: 3 1 2 -3 8 2 1 3 22 3 2 1 28解得:1x =6,2x =4,3x =2;二、LU 分解法求解线性方程组1、算法原理应用高斯消去法解n 阶线性方程Ax b =经过1n -步消去后得出一个等价的上三角形方程组()()n n A x b =,对上三角形方程组用逐步回代就可以求出解来。

这个过程也可通过矩阵分解来实现。

将非奇异阵分解成一个下三角阵L 和上三角阵U 的乘积A LU =称为对矩阵A 的三角分解,又称LU 分解。

根据LU 分解,将Ax b =分解为Ly bUx y =??=?形式,简化了求解问题。

2、输入输出变量ij a 为系数矩阵元素i b 为常数矩阵系数,i j i jl u 分别为下、上三角矩阵元素 k 表示第k 步消元 3、具体算例输入增广矩阵 3 2 3 4 39 3 -2 2 14 4 2 3 43 解得: 6 5 3三、拉格朗日插值1、算法原理设函数()y f x =在区间[a,b]上有节点01,,,,n x x x 上的函数值,构造一个次数不超过n次的代数多项式1110()n n n n p x a x a x a x a --=++++ ,使 (),0,1,,i i P x y i n == 。

数值分析上机

数值分析上机

7 数值分析上机作业
m=0; else if(fabs(t1)<=1) m=0.5*fabs(t1)*fabs(t1)*fabs(t1)-t1*t1+2.0/3.0; else m=-1.0/6.0*fabs(t1)*fabs(t1)*fabs(t1)+t1*t1-2*fabs(t1)+4.0/3.0; return(m); } float func2(float t2) {double n; if(fabs(t2)>=2.0/3.0) n=0; else if(-0.5<=fabs(t2)&&fabs(t2)<=0.5) n=-t2*t2+3.0/4.0; else n=0.5*t2*t2-(3.0/2.0)*fabs(t2)+9.0/8.0; return(n); }
6 数值分析上机作业
int i,j,k; int a[12][12]={{-1,0,1,0,0,0,0,0,0,0,0,0}, {1,4,1,0,0,0,0,0,0,0,0,0}, {0,1,4,1,0,0,0,0,0,0,0,0}, {0,0,1,4,1,0,0,0,0,0,0,0}, {0,0,0,1,4,1,0,0,0,0,0,0}, {0,0,0,0,1,4,1,0,0,0,0,0}, {0,0,0,0,0,1,4,1,0,0,0,0}, {0,0,0,0,0,0,1,4,1,0,0,0}, {0,0,0,0,0,0,0,1,4,1,0,0}, {0,0,0,0,0,0,0,0,1,4,1,0}, {0,0,0,0,0,0,0,0,0,1,4,1}, {0,0,0,0,0,0,0,0,0,-1,0,1}}; float b1,b2; float s1=0,s2=0; for (k=0;k<=500;k++) for (i=0;i<=11;i++) {b1=0; b2=0;

最新(完美版)数值分析上机作业

最新(完美版)数值分析上机作业

一. 上机作业任务一: 用五点差分格式求解Poisson 方程边值问题,P124-------3、4(任选一题)。

二. 上机作业任务二:用Simpson 求积法计算定积分()baf x dx ⎰。

下面两种方法任选一。

(1)变步长复化Simpson 求积法。

(2)自适应Simpson 求积法三. 上机作业任务三:用MATLAB 语言编写连续函数最佳平方逼近的算法程序(函数式M 文件)。

要求算法程序可以适应不同的具体函数,具有一定的通用性。

并用此程序进行数值试验,写出计算实习报告。

所编程序具有以下功能:1. 用Lengendre 多项式做基,并适合于构造任意次数的最佳平方逼近多项式。

可利用递推关系 0112()1,()()(21)()(1)()/2,3,.....n n n P x P x xP x n xP x n P x n n --===---⎡⎤⎣⎦=2. 被逼近函数f(x)用M 文件建立数学函数。

这样,此程序可通过修改建立数学函数的M 文件以适用不同的被逼近函数(要学会用函数句柄)。

3. 要考虑一般的情况]1,1[],[)(+-≠∈b a x f 。

因此,程序中要有变量代换的功能。

4. 计算组合系数时,计算函数的积分采用数值积分的方法。

5. 程序中应包括帮助文本和必要的注释语句。

另外,程序中也要有必要的反馈信息。

6. 程序输入:(1)待求的被逼近函数值的数据点0x (可以是一个数值或向量)(2)区间端点:a,b 。

7. 程序输出:(1)拟合系数:012,,,...,n c c c c(2)待求的被逼近函数值00001102200()()()()()n n s x c P x c P x c P x c P x =++++ 8. 试验函数:()cos ,[0,4]f x x x x =∈+;也可自选其它的试验函数。

9. 用所编程序直接进行计算,检测程序的正确性,并理解算法。

10. 分别求二次、三次、。

数值方法上机作业

数值方法上机作业

第二章插值法1.通用程序编制(1)n次拉格朗日插值计算公式#include<stdio.h>void main(){int n,m,i,j,k;float a[100],b[100],c,y[100],x[100]; /*输入插值多项式次数*/scanf("%d",&n);/*输入所求未知量个数*/scanf("%d",&m);/*输入插值节点坐标*/for(i=0;i<=n;i++){scanf("%f",&a[i]);scanf("%f",&b[i]);}/*输入所求点x坐标*/for(i=0;i<m;i++){scanf("%f",&x[i]);}/*计算*/for(j=0;j<m;j++){y[j]=0;for(k=0;k<=n;k++){c=1;for(i=0;i<=n;i++){if(k!=i)c=c*(x[j]-a[i])/(a[k]-a[i]);}c=c*b[k];y[j]=y[j]+c;}}/*输出计算结果*/for(i=0;i<m;i++){printf("%f\n",y[i]);}getchar();}(2)n次牛顿向前插值计算公式#include<stdio.h>void main(){int n,m,i,j;float x,h,a,b[100],c[100],y[100],t[100]; /*输入插值多项式次数*/scanf("%d",&n);/*输入所求未知量个数*/scanf("%d",&m);/*输入步长*/scanf("%f",&h);/*输入xo点坐标*/scanf("%f",&x);/*输入插值节点坐标*/for(i=0;i<=n;i++){scanf("%f",&b[i]);}/*输入所求点t值*/for(i=0;i<m;i++){scanf("%f",&t[i]);}/*造向前差分表*/for(i=0;i<n;i++){for(j=i;j<n;j++){c[j+1]=b[j+1]-b[j];}for(j=i+1;j<=n;j++){b[j]=c[j];}}/*计算*/for(i=0;i<m;i++){a=1;y[i]=0;for(j=0;j<=n;j++){y[i]=y[i]+a*b[j];a=a*(t[i]-j)/(j+1);}}/*输出计算结果*/for(i=0;i<m;i++){printf("x=%f y=%f\n",x+t[i]*h,y[i]); }getchar();}(3)n次牛顿向后插值公式#include<stdio.h>void main(){int n,m,i,j;float x,h,a,b[100],c[100],y[100],t[100];/*输入插值多项式次数*/scanf("%d",&n);/*输入所求未知量个数*/scanf("%d",&m);/*输入步长*/scanf("%f",&h);/*输入Xn点坐标*/scanf("%f",&x);/*倒着输入插值节点坐标*/for(i=0;i<=n;i++){scanf("%f",&b[i]);}/*输入所求点t值*/for(i=0;i<m;i++){scanf("%f",&t[i]);}/*造向后差分表*/for(i=0;i<n;i++){for(j=i;j<n;j++){c[j+1]=b[j]-b[j+1];}for(j=i+1;j<=n;j++){b[j]=c[j];}}/*计算*/for(i=0;i<m;i++){a=1;y[i]=0;for(j=0;j<=n;j++){y[i]=y[i]+a*b[j];a=a*(t[i]+j)/(j+1);}}/*输出计算结果*/for(i=0;i<m;i++){printf("x=%f y=%f\n",x+t[i]*h,y[i]); }getchar();}2.计算(1)运用通用程序1计算结果如下x=1.54时, y=0.431808x=1.98时, y=0.683157运用通用程序3计算结果如下x=1.54时, y=0.431808x=1.98时, y=0.683158 (2)n=5时,运用通用程序1计算结果如下运用通用程序2计算结果如下n=10时,运用通用程序1计算结果如下运用通用程序2计算结果如下计算结果与真实值的比较与真实值相比,在[-0.15 0.15]的范围内,n=10比n=5能更好的接近真实值。

数值上机作业1-8

数值上机作业1-8

1. 利用区间二分法计算下述方程在[1,2]的近似根,要求误差小于0.001 #include<fstream.h> #include<iostream.h> #include<math.h> float f(float x); void main() { ifstream in("1in.txt",ios::in); ofstream out; cout<<"************求方程x^3-x-1=0在[1,2]上的近似根**************"<<endl; float e,a=1,b=2,x,value,i=0; in>>e; if(f(1)*f(2)>0) cout<<"区间不合适"; else { while(fabs(a-b)>e) { x=0.5*(a+b); value=f(x); if(f(a)*f(x)<0) b=x; else a=x; i++; } } out.open("1out.txt",ios::ou t); out<<"方程近似解为:"<<0.5*(a+b); cout<<"求解成功!迭代次数为"<<i<<"次"<<endl; in.close; out.close; } float f(float x) { return pow(x,3)-x-1; }、0.0012. 用牛顿迭代法求取下列方程在0.5附近的根,要求误差小于0.0001。

#include<fstream.h> #include<iostream.h> #include<math.h> float f1(float x); float f2(float x);const float e1=2.71828183; void main() { float x0,e,x1; ifstreamin("2in.txt",ios::in); in>>x0>>e; while(fabs(f1(x0))>e) { x1=x0-f1(x0)/f2(x0); x0=x1; } ofstreamout("2out.txt",ios::out); out<<"近似解为:"<<x1; in.close;out.close;}float f1(float x) { return x-pow(e1,-x); }float f2(float x) { return 1+pow(e1,-x); }0.5 0.0001310x x --=x x e-=3. 用列主元素消去法编程,最大变元数200;给出下面方程组的运算结果。

数值计算方法上机作业

数值计算方法上机作业

《数值计算方法》上机作业学院:机械学院专业:机械设计及理论姓名:陈国保学号:2010412118日期:2010年12月18日第二章:插值法 2.1,问题:1.编制通用程序,对n+1个节点i x 及()ii y f x = (0,,)i n = (1)n 次拉格朗日插值计算公式Ln(x); (2)n 次牛顿向前插值计算公式; (3)n 次牛顿向后插值计算公式; 2.已知()ln ,[,][1,2]f x x a b ==,取0.1,1,01,,10.i h x i hi ==+=用通用程序计算ln1.54及ln1.98的近似值。

流程图:2.2,源程序:主调函数:#include <stdio.h>#include <math.h>float Ln(float x1,int n,float x[80],float y[80]);float Nnf(float x1,int n,float x[80],float y[80]);float Nnr(float x1,int n,float x[80],float y[80]);main(){float x[80],y[80],x1,h,f_Ln,f_Nnf,f_Nnr;int n,i;//输入插值点printf("Please enter the interpolating point x:");scanf("%f",&x1);//输入拟合阶数printf("Enter the order n:");scanf("%d",&n);//输入已知数表的第一点x坐标printf("Enter the start point:");scanf("%f",&x[0]);//输入插值步长printf("Enter the step size h:");scanf("%f",&h);//计算已知数表的第一点y坐标y[0]=log(x[0]);//计算其余点的坐标for(i=1;i<=n;i++){x[i]=x[0]+i*h;y[i]=log(x[i]);}//拉格朗日法插值求解f_Ln=Ln(x1,n,x,y);//牛顿向前插值法求解f_Nnf=Nnf(x1,n,x,y);//牛顿向后插值法求解f_Nnr=Nnr(x1,n,x,y);//输出结果printf("The appoximate value caculated using Lagrange interpolation mathod is:\n%f\n",f_Ln);printf("The appoximate value caculated using Netown forward interpolation mathod is:\n%f\n",f_Nnf);printf("The appoximate value caculated using Netown backward interpolation mathod is:\n%f\n",f_Nnr);}拉格朗日插值函数:#include <stdio.h>#include <math.h>float Ln(float x1,int n,float x[80],float y[80]){int i,j;float sum=0;float nom=1,denom=1; //nom为基函数的分子,denom为基函数的分母 for(i=0;i<=n;i++){nom=1;denom=1;for(j=0;j<=n;j++)if(i==j) {nom*=1;denom*=1;} //当i=j时,分子分母不乘任何项 else {nom=nom*(x1-x[j]);denom=denom*(x[i]-x[j]);}//否则,分子自乘x-xj,分母自乘xi-xjsum=sum+nom/denom*y[i];//sum自加(x-xj)/(xi-xj)*yj}return sum;}牛顿向前插值函数:#include <stdio.h>#include <math.h>float Nnf(float x1,int n,float x[80],float y[80]){int i,j;float sum=0,t,h;float dif[80][80];float nom=1,denom=1;//nom为分子t(t-1)...(t-n+1)//denom为分母(n+1)!//计算步长hh=(x[n]-x[0])/n;//计算tt=(x1-x[0])/h;//构造向前差分表for(i=0;i<=n;i++)dif[0][i]=y[i];for(i=1;i<=n;i++)for(j=0;j<=n-i;j++)dif[i][j]=dif[i-1][j+1]-dif[i-1][j];sum=y[0];//计算插值公式for(i=1;i<=n;i++){nom=1;denom=1;for(j=1;j<=i;j++){nom*=(t-j+1);denom*=j;}sum+=dif[i][0]*nom/denom;}return sum;}牛顿向后插值函数:#include <stdio.h>#include <math.h>float Nnr(float x1,int n,float x[80],float y[80]) {int i,j;float sum=0,t,h;float dif[80][80];float nom=1,denom=1;//nom为分子t(t+1)...(t+n-1)//denom为分母n!//计算步长h=(x[n]-x[0])/n;//计算tt=(x1-x[n])/h;//构造向后差分表for(i=0;i<=n;i++)dif[0][i]=y[i];for(i=1;i<=n;i++)for(j=n;j>=i;j--)dif[i][j]=dif[i-1][j]-dif[i-1][j-1];sum=y[n];//计算插值公式for(i=1;i<=n;i++){nom=1;denom=1;for(j=1;j<=i;j++){nom*=(t+j-1);denom*=j;}sum+=dif[i][n]*nom/denom;}return sum;}计算结果:Please enter the interpolating point x:1.54Enter the order n:10Enter the start point:1Enter the step size h:0.1The appoximate value caculated using Lagrange interpolation mathod is:0.431782The appoximate value caculated using Netown forward interpolation mathod is: 0.431782The appoximate value caculated using Netown backward interpolation mathod is: 0.431782Press any key to continuePlease enter the interpolating point x:1.98Enter the order n:10Enter the start point:1Enter the step size h:0.1The appoximate value caculated using Lagrange interpolation mathod is:0.683097The appoximate value caculated using Netown forward interpolation mathod is: 0.683097The appoximate value caculated using Netown backward interpolation mathod is: 0.6830972.3计算结果分析:由以上计算结果可以看出采用10个点插值所得出的结果比较理想,误差很小,并且拉格朗日法,牛顿向前插值法和牛顿向后插值法计算的结果差不多。

数值计算方法上机答案

数值计算方法上机答案
2
0.23


22.322

b


54 240.236


29.304

117.818
2.991 1 13
3.907 0.017
3
1.007 2.1 0.5 61.705 0.91 4.5
1.006 6.3 1
12.17 4.918
[ 1.0, 2.0, 3.0, 4.5, 5.0, 21.8]
ans =
1.0000 -2.0000
2.9999 -4.0001
5.0000 -6.0008
17 1 4 3 1 2 3 7

2
10 1
7
2 1
1
4
1 1 8 2 5 2 1 1
3、
A


max1=0; for i=k:n
if abs(A(i,k))>max1 max1=abs(A(i,k));r=i;
end end if max1<1e-6
flag='failure';return; end if r>k
for j=k:n z=A(k,j);A(k,j)=A(r,j);A(r,j)=z;
[ -1.0, 34.211, -1.0, -2.1, 6.3, -1.7]
[
0, 0.5, 13.0, -0.5, 1.0, -1.5]
[ 4.501, 3.11, -3.907, -61.705, 12.17, 8.999]
[ 0.101, -0.812, -0.017, -0.91, 4.918, 0.1]
k x(k) 0 1.500000 1 0.784472 2 0.739519

数值计算方法上机实验题

数值计算方法上机实验题

数值计算方法上机实验实验内容:1.要求:分别用复化梯形法,复化Simpson 法和 Romberg 公式计算.2.给定积分dx e x⎰31和dx x ⎰311 ,分别用下列方法计算积分值要求准确到510- ,并比较分析计算时间. 1)变步长梯形法; 2)变步长 Simpson 法; 3) Romberg 方法.算法描述:1、复合梯形法:⎰=tdt t a t V 0)()( ))()(2)((211∑-=++=n k k n b f x f a f hT输入 被积函数数据点t,a. 输出 积分值.n T复合Simpson 法:⎰=tdt t a t V 0)()( ))()(2)(4)((6101121∑∑---=++++=n k n k k k n b f x f x f a f hS输入 被积函数f(x),积分区间[a,b]和n 输出 复合Simpson 积分值n S步1 .);()(;a x b f a f S nab h n ⇐-⇐-⇐ 步2 对n k ,,2,1 =执行).(2;2);(4;2x f S S hx x x f S S h x x n n n n +⇐+⇐+⇐+⇐步3 n n S hS ⨯⇐6步4 输出n SRomberg 积分法:根据已知数据对其进行多项式拟合得出p(x);f(x)⇐p(x); 输入 被积函数f(x),积分区间端点a,b,允许误差ε 输出 Romberg 积分值n R 2 步1 .0;0;0;0));()((2;1111⇐===+⇐-⇐k R C S b f a f hT a b h 步2 反复执行步3→步9. 步3 .2;0h a x S +⇐⇐ 步4 反复执行步5→步6. 步5 ;);(h x x x f S S +⇐+⇐步6 若x ≥b,则退出本层循环. 步7 执行.6316364;1511516;3134;2212212212212C C R S S C T T S S h T T -⇐-⇐-⇐+⇐步8 执行.1;;;;;2;2121212112+⇐⇐⇐⇐⇐⇐-⇐k k R R C C S S T T hh R R e 步9 若e ≤ε且k ≥5,则退出循环. 步10 .22R R n ⇐ 步11 输出.2n R2、变步长梯形算法:功能 求积分⎰ba)(dx x f ,允许误差为ε。

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

数值计算方法上机作业(C++版)2008-12-01第二章插值法上机作业一、编制通用程序对n+1个节点xi及yi=f(xi)(i=1,……,n)(1)n次拉格朗日插值计算公式Ln(x);(2)n次牛顿向前插值计算公式;(3)n次牛顿向后插值计算公式。

定义头文件:interpolate.h#ifndef INTERPOTA TE_H_H#define INTERPOTA TE_H_Husing namespace std;const int Zero = 1e-6;bool LagrangeInterpolate(const int n, double *x, double *y, double intervalue, double *result_x); bool NewtonFront(const int n, double *x, double *y, double intervalue, double *result_x);bool NewtonBack(const int n, double *x, double *y, double intervalue, double *result_x);#endif1.拉格朗日插值子程序流程图及程序:#include <iostream>#include <iomanip>#include <math.h>#include "Interpolate.h"using namespace std;bool LagrangeInterpolate(const int n, double *x, double *y, double intervalue, double *result_x) {int i,j,k;double Vandermonde = 1.0;*result_x = 0.0;for(k=0; k<=n; ++k){Vandermonde = 1.0;for(i=0; i<=n; ++i){if(i != k){Vandermonde = ( (intervalue - x[i]) / (x[k] - x[i]) ) * Vandermonde;}}*result_x = *result_x + Vandermonde * y[k];}cout<<"Interpolate at X = "<<setiosflags(ios::fixed | ios::showpoint)<<setw(10) <<intervalue<<" =====>> "<<setw(10)<<*result_x<<endl;return true;}开始For(k=0;k<=n;k++)For(i=0;I<=n;i++)TrueIf(i!=k)Vandermonde = ( (intervalue - x[i]) / (x[k] - x[i]) ) * Vandermonde;truefalse*result_x = *result_x + Vandermonde *y[k];输出*result_xreturn true;False结束2.牛顿向前插值子程序流程图及程序#include <iostream> #include <iomanip> #include <math.h>#include "Interpolate.h"bool NewtonFront(const int n, double *x, double *y, double intervalue, double *result_x) { int i,j; int begin = 0; int N =n; double t = 0.0; double mult_t =1.0; //=====存放t 多项式乘积,阶乘 double temp1 = 0.0; double temp2 = 0.0; //=========计算出插值的X0,确定插值次数N==========//for(i=0; i<=n; ++i){if(intervalue - x[i] < 0){begin = i - 1;N = n - begin;t = (intervalue - x[begin]) / (x[1] - x[0]);break;}else if( fabs(intervalue - x[i]) < Zero ){*result_x = y[i];cout<<"Interpolate at X = "<<setiosflags(ios::fixed | ios::showpoint)<<setw(10) <<intervalue<<" =====>> "<<setw(10)<<*result_x<<endl;return true;}}//=========开始插值初始化========================//double * X = new double[N+1];double * Y = new double[N+1];double * difference_table = new double[N+1];for(i=begin; i<=n; ++i){X[i-begin] = x[i];Y[i-begin] = y[i];difference_table[i-begin] = y[i];}//==========开始插值计算========================//*result_x = 0.0;for(i=0; i<=N; ++i){//==============计算差分表=================//temp2 = difference_table[i];for(j=i+1; j<=N; ++j){temp1 = difference_table[j];difference_table[j] = difference_table[j] - temp2;temp2 = temp1;}//==============计算阶乘和多项式===========//if(i){mult_t = mult_t * ( (t - i + 1) / i );}*result_x = *result_x + mult_t * difference_table[i];}cout<<"Interpolate at X = "<<setiosflags(ios::fixed | ios::showpoint)<<setw(10) <<intervalue<<" =====>> "<<setw(10)<<*result_x<<endl;delete [] X;delete [] Y;delete [] difference_table;return true;}开始For(i=0;i<=n;i++)if(intervalue - x[i]< 0)begin = i - 1;N = n - begin;t = (intervalue - x[begin]) /(x[1] - x[0]);break;Trueelse if( fabs(intervalue - x[i]) < Zero )false*result_x = y[i];return true;trueFor(i=begin;I<=n;i++)For(i=0;i<=N;i++)X[i-begin] = x[i];Y[i-begin] = y[i];difference_table[i-begin] = y[i];temp1 = difference_table[j];difference_table[j] = difference_table[j] - temp2;temp2 = temp1;for(j=i+1; j<=N;++j)trueIf(i)mult_t = mult_t * ( (t- i + 1) / i );*result_x = *result_x+ mult_t * difference_table[i];cout<<*result_xreturn true;truefalse结束falsefalse3.牛顿向后插值子程序流程图及程序#include <iostream>#include <iomanip>#include <math.h>#include "Interpolate.h"bool NewtonBack(const int n, double *x, double *y, double intervalue, double *result_x){int i,j;int end = 0;int N =n;double t = 0.0;double mult_t =1.0; //=====存放t多项式乘积,阶乘double temp1 = 0.0;double temp2 = 0.0;//=========计算出插值的X0,确定插值次数N==========//for(i=n; i>=0; --i){if(intervalue - x[i] > 0){end = i + 1;N = end;t = (intervalue - x[end]) / (x[1] - x[0]);break;}else if( fabs(intervalue - x[i]) < Zero ){*result_x = y[i];cout<<"Interpolate at X = "<<setiosflags(ios::fixed | ios::showpoint)<<setw(10) <<intervalue<<" =====>> "<<setw(10)<<*result_x<<endl;return true;}}//=========开始插值初始化========================//double * X = new double[N+1];double * Y = new double[N+1];double * difference_table = new double[N+1];for(i=0; i<=N; ++i){X[i] = x[i];Y[i] = y[i];difference_table[i] = y[i];}//==========开始插值计算========================//*result_x = 0.0;for(i=N; i>=0; --i){//==============计算差分表=================//temp2 = difference_table[i];for(j=i-1; j>=0; --j){temp1 = difference_table[j];difference_table[j] = temp2 - difference_table[j];temp2 = temp1;}//==============计算阶乘和多项式===========//if(N-i){mult_t = mult_t * ( (t + (N - i) - 1) / (N - i) );}*result_x = *result_x + mult_t * difference_table[i];}cout<<"Interpolate at X = "<<setiosflags(ios::fixed | ios::showpoint)<<setw(10) <<intervalue<<" =====>> "<<setw(10)<<*result_x<<endl;delete [] X;delete [] Y;delete [] difference_table;return true;}开始For(i=n;i>=0;i--)if(intervalue - x[i]> 0)end = i + 1;N = end;t = (intervalue - x[end]) / (x[1]- x[0]);break;Trueelse if( fabs(intervalue - x[i]) < Zero )false*result_x = y[i];return true;truefor(i=0; i<=N;++i)for(i=N; i>=0; --i)X[i] = x[i];Y[i] = y[i];difference_table[i] =y[i];temp1 = difference_table[j];difference_table[j] = temp2 -difference_table[j];temp2 = temp1;for(j=i-1; j>=0; --j)trueif(N-i)mult_t = mult_t * ( (t + (N - i) - 1) / (N - i) )*result_x = *result_x+ mult_t * difference_table[i];cout<<*result_xreturn true;truefalse结束falsefalse二、计算1.已知f (x )=lnx ,[a ,b]=[1,2],取h =0.1,xi =1+ih ,i=0,1,……,10。

相关文档
最新文档