东南大学计算方法实验报告
- 格式:doc
- 大小:137.00 KB
- 文档页数:16
计算方法与实习
实验报告
学 院:电气工程学院
指导老师:***
班 级:160093
* *****
学 号:********
实习题一
实验1 拉格朗日插值法
一、方法原理
n次拉格朗日插值多项式为:Ln(x)=y0l0(x)+y1l1(x)+y2l2(x)+…+ynln(x)
n=1时,称为线性插值,L1(x)=y0(x-x1)/(x0-x1)+ y1(x-x0)/(x1-x0)=y0+(y1-x0)(x-x0)/(x1-x0)
n=2时,称为二次插值或抛物线插值,精度相对高些
L2(x)=y0(x-x1)(x-x2)/(x0-x1)/(x0-x2)+y1(x-x0)(x-x2)/(x1-x0)/(x1-x2)+y2(x-x0)(x-x1)/(x2-x0)/(x2-x1)
二、主要思路
使用线性方程组求系数构造插值公式相对复杂,可改用构造方法来插值。
对节点xi(i=0,1,…,n)中任一点xk(0<=k<=n)作一n 次多项式lk(xk),使它在该点上取值为1,而在其余点xi(i=0,1,…,k-1,k+1,…,n)上为0,则插值多项式为Ln(x)=y0l0(x)+y1l1(x)+y2l2(x)+…+ynln(x)
上式表明:n 个点xi(i=0,1,…,k-1,k+1,…,n)都是lk(x)的零点。可求得lk
三.计算方法及过程:1.输入节点的个数n
2.输入各个节点的横纵坐标
3.输入插值点
4.调用函数,返回z
函数语句与形参说明
程序源代码如下:
#include
#include
using namespace std;
#define N 100
double fun(double *x,double *y, int n,double p);
void main()
{int i,n;
cout<<"输入节点的个数n:";
cin>>n;
double x[N], y[N],p;
cout<<"please input xiangliang x= "<
for(i=0;i>x[i];
cout<<"please input xiangliang y= "<
for(i=0;i>y[i];
cout<<"please input LagelangrichazhiJieDian p= "<
cin>>p; 形参与函数类型 参数意义
int n 节点的个数
double x[n](double *x) 存放n个节点的值
double y[n](double *y) 存放n个节点相对应的函数值
double p 指定插值点的值
double fun() 函数返回一个双精度实型函数值,即插值点p处的近似函数值 cout<<"The Answer= "<
system("pause") ;}
double fun(double x[],double y[], int n,double p)
{double z=0,s=1.0;
int k=0,i=0;
double L[N];
while(k
{ if(k==0)
{ for(i=1;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
L[k]=s*y[k];
k++;}
}
for(i=0;i
return z;
}
五.实验分析
n=2时,为一次插值,即线性插值
n=3时,为二次插值,即抛物线插值
n=1,此时只有一个节点,插值点的值就是该节点的函数值
n<1时,结果都是返回0的;这里做了n=0和n=-7两种情况
3
常用的是线性插值和抛物线插值,显然,抛物线精度相对高些
n次插值多项式Ln(x)通常是次数为n的多项式,特殊情况可能次数小于n.例如:通过三点的二次插值多项式L2(x),如果三点共线,则y=L2(x)就是一条直线,而不是抛物线,这时L2(x)是一次式。
拟合曲线光顺性差
实验2 牛顿插值法
一、方法原理及基本思路
在拉格朗日插值方法中,若增加一个节点数据,其插值的多项式需重新计算。现构造一个插值多项式Nn(x),只需对Nn-1(x)作简单修正(如增加某项)即可得到,这样计算方便。
利用牛顿插值公式,当增加一个节点时,只需在后面多计算一项,而前面的计算仍有用;另一方面Nn(x)的各项系数恰好又是各阶差商,而各阶差商可用差商公式来计算。
由线性代数知,对任何一个不高n次的多项式P(x)=b0+b1x+b2x2+…+bnxn (幂基) ①
也可将其写成P(x)=a0+a1(x-x0)+a2(x-x0) (x-x1)+…+an(x-x0) …(x-xn-1)
其中ai为系数,xi为给定节点,可由①求出ai 一般情况下,牛顿插值多项式Nn(x)可写成: Nn(x)= a0+a1(x-x0)+a2(x-x0) (x-x1)+…+an(x-x0) …(x-xn-1))
只需求出系数ai,即可得到插值多项式。
二、计算方法及过程
1.先后输入节点个数n和节点的横纵坐标,插值点的横坐标,最后输入精度e
2. 用do-while循环语句得到跳出循环时k的值
3.将k值与n-1进行比较,若在达到精度时k
函数语句与形参说明
程序源代码如下:
#include
#include
using namespace std;
#define MAX 100
void main()
{ float x[MAX],y[MAX];
float x0,y0,e,N1;
float N0=0;
int i,k,n;
cout<<"输入节点的个数,n=";
cin>>n;
cout<<"请输入插值节点!"<
for(i=0;i>x[i];
cout<<"请输入对应的函数值!"<
for(i=0;i>y[i];
cout<<"请输入插值点,x0=";
cin>>x0;
cout<<"请输入精度,e=";
cin>>e;
y0=1; N1=y[0]; k=0;
do { k++;
N0=N1;
y0=y0*(x0-x[k-1]);
for(i=0;i
N1=N0+y0*y[k];
} while (fabs(N1-N0) > e && k<(n-1)); 形参与函数类型 参数意义
int n 节点的个数
float x[MAX] 存放n个节点的值(从小到大)
Float y[MAX]; 存放n个节点相对应的函数值
float x0,y0 指定插值点的横纵坐标
float e 精度 if (k==(n-1)) cout<<"计算失败!";
if (k<(n-1)) cout<<"输出结果y[x0]="<
system("pause");
}
三.运行结果测试:
题一:已知f(x)=sh(x)的函数表如下:计算f(0.23)的近似值
xi 0 0.20 0.30 0.50
Sh(xi) 0 0.20134 0.30452 0.52110
实习题二
1. 用牛顿法求下列方程的根:
3)lg20xx
实验代码:
#include
#include
#define N 100
#define eps 1e-6
#define eta 1e-8
float Newton(float(*f)(float),float(*f1)(float),float x0)
{
float x1,d;
int k=0;
do
{
x1=x0-(*f)(x0)/(*f1)(x0);
if(k++>N||fabs((*f1)(x1))
{
printf("\n Newton 迭代发散");
break;
}
d=fabs(x1)<1?x1-x0:(x1-x0)/x1;
x0=x1;
printf("x(%d)=%f\t",k,x0);
}
while(fabs(d)>eps&&fabs((*f)(x1))>eta);
return x1;
}
float f(float x)
{