东南大学计算方法实验报告

  • 格式: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)

{