《c语言插值算法》课件
- 格式:pptx
- 大小:2.80 MB
- 文档页数:22


// xg.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include
#include"math.h"
#define N 4
using namespace std;
void main()
{ void lin(double x[],double y[],double t,int n);
void newton(double a[],double b[],double t,double h,int
n);
double t,h,d; int i,j,n,k;
double x[N]={0.4,0.5,0.6,0.7};
double y[N]={0.38942,0.47943,0.56464,0.64422};
double a[N],b[N];
h=0.1; //h为等距节点宽度,t为插值点
t=0.57891;
if(!h) cout<<"此函数为常数"<
else
{
if(tx[N-1])
cout<
else
{
cout<<"利用分段线性插值:"<
lin(x,y,t,N);
cout<<"利用等距节点牛顿插值:"<
newton(x,y,t,h,N);
}
}
}
void lin(double x[],double y[],double t,int n)
{
int i;double w,e,c; //w为逼近值e为余项
for(i=0;i
{if(t==x[i])
{
cout<<"sin("<
} else if (t>x[i])
{ w=y[i]*(t-x[i+1])/(x[i]-x[i+1])+y[i+1]*(t-x[i])/(x[i+1]-x[i]);
#include
#include
#include
float lagrange(float *x,float *y,float xx,int n) /*拉¤-格?朗¤¨º日¨?插?值¦Ì算?法¤¡§*/
{
int i,j;
float *a,yy=0.0; /*a作Á¡Â为a临¢¨´时º¡À变À?量¢?,ê?记?录?拉¤-格?朗¤¨º日¨?插?值¦Ì多¨¤项?式º?*/
a=(float *)malloc(n*sizeof(float));
for(i=0;i<=n-1;i++)
{
a[i]=y[i];
for(j=0;j<=n-1;j++)
if(j!=i) a[i]*=(xx-x[j])/(x[i]-x[j]);
yy+=a[i];
}
free(a);
return yy;
}
int main()
{
int i;
int n;
float x[20],y[20],xx,yy;
printf("Input n:");
scanf("%d",&n);
if(n>=20)
{
printf("Error!The value of n must in (0,20)."); getch();return 1;
}
if(n<=0)
{
printf("Error! The value of n must in (0,20)."); getch(); return 1;
就是表达出一个函数Ln(x)的运算程序:能输入某个数值进去,结果以表格或图像的形式输出,实在两者都不行就最简单的输出就行
简单例如:已知函数y=2x+1
n 0 1 2 3 4 5 6 7 8
x n 0 1 2 3 4 5 6 7 8
y n 1 3 5 7 9 11 13 15
17
当然,我们不知道以上的函数,而且这个函数也假设不容易得出,所以我们要用一种通用的方法来构造一个函数Ln(x)用来代替(当然,其中有误差,但没关系)
这个方法是:Ln(x)=∑yklk(x) (求和范围是k=0到n)
(x-x0)(x-x1)…(x-x k-1)(x-x k+1)…(x-xn) 其中 lk(x)= —————————————————— (k=0,1,2…n) (xk-x0)(xk-x1)…(xk-xk-1)(xk-xk+1)…(xk-xn)
(中间下标相同的哪项没有!)
就是讲,假设我想求L3(1.5)的话,即求当输入n=3,x=1.5时,我们所构造的函数值:
L3(x)=∑yklk(x)=y0l0(x)+y1l1(x)+y2l2(x)+y3l3(x)
=1*[(x-x1)(x-x2)(x-x3)] / [(x0-x1)(x0-x2)(x0-x3)]
+ 3*[(x-x0)(x-x2)(x-x3)] / [(x1-x0)(x1-x2)(x1-x3)]
+ 5*[(x-x0)(x-x1)(x-x3)] / [(x2-x0)(x2-x1)(x2-x3)]
+ 7*[(x-x0)(x-x1)(x-x2)] / [(x3-x0)(x3-x1)(x3-x2)]
=1*[(1.5-1)(1.5-2)(1.5-3)] / [(0-1)(0-2)(0-3)] + 3*[(1.5-0)( 1.5-2)( 1.5-3)] / [(1-0)(1-2)(1-3)]
实验 一 .拉格朗日插值法C语言的实现
1.实验目的:
进一步熟悉拉格朗日插值法。
掌握编程语言字符处理程序的设计和调试技术。
2.实验要求:
已知:某些点的坐标以及点数。
输入:条件点数以及这些点的坐标 。
输出:根据给定的点求出其对应的拉格朗日插值多项式的值 。
3.程序流程:
(1)输入已知点的个数;
(2)分别输入已知点的X坐标;
(3)分别输入已知点的Y坐标;
(4)通过调用函数lagrange函数,来求某点所对应的函数值。
拉格朗日插值多项式如下:
0L()()0,1,nnjkkjjkxylxyjn……
其中00()()0,1,,()kkxxlxknxxk-1k+1nkk-1kk+1kn……(x-x)(x-x)?…(x-x)…………(x-x)(x-x)?…(x-x)
程序流程图:
↓
↓
↓ 输入已知点个数n 开始
输入已知点的X坐标以及输入已知点的Y坐标
调用函数lagrange函数
↓
程序如下:
#include
#include
#include
float lagrange(float *x,float *y,float xx,int n) /*拉格朗日插值算法*/
{
int i,j;
float *a,yy=0.0; /*a作为临时变量,记录拉格朗日插值多项式*/
a=(float *)malloc(n*sizeof(float));
for(i=0;i<=n-1;i++)
{
a[i]=y[i];
for(j=0;j<=n-1;j++)
if(j!=i) a[i]*=(xx-x[j])/(x[i]-x[j]);