📄 intrpolat.cpp
字号:
#include "Intrpolat.h"
#include "iostream.h"
//存在一些问题 比如 不是按顺序,只有一个节点等
double lagrange(int n,double *x,double *y,double cx)
{
int i,j;
double fore,back;
double *l=new double[n];
//假设x中的值已经按由小到大排列
if(cx>x[n-1]||cx<x[0])
{
cout<<"请输入界于边界之间的值\n";
return 0;
}
for(i=0;i<n;i++)
{
fore=back=1;
for(j=0;j<i;j++)
{
fore*=(cx-x[j])/(x[i]-x[j]);
}
for(j=i+1;j<n;j++)
{
back*=(cx-x[j])/(x[i]-x[j]);
}
l[i]=fore*back;
}
double result=0;
for(i=0;i<n;i++)
{
result+=l[i]*y[i];
}
return result;
}
//=============================================
double linear(int n,double *x,double *y,double cx)
{
int k;
int i;
//假设x中的值已经按由小到大排列
if(cx>x[n-1]||cx<x[0])
{
cout<<"请输入界于边界之间的值\n";
return 0;
}
double result;
if(cx==x[0])
{
return result=y[0];
}
if(cx==x[n-1])
{
return result=y[n-1];
}
for(i=0;i<n;i++)
{
if(cx<=x[i])
{
k=i-1;
break;
}
}
result=((cx-x[k+1])/(x[k]-x[k+1]))*y[k]+((cx-x[k])/(x[k+1]-x[k]))*y[k+1];
return result;
}
double newton(int n,double *x,double *y,double cx)
{
int i;
double ** a;
a=new double *[n];
for(i=0;i<n;i++)
{
a[i]=new double [n-i];
}
for(i=0;i<n;i++)
{
a[0][i]=y[i];
}
int j;
for(i=1;i<n;i++)
{
for(j=0;j<n-i;j++)
{
a[i][j]=(a[i-1][j]-a[i-1][j+1])/(x[j]-x[i+j]);
}
}
double result=0;
double temp;
for(i=0;i<n;i++)
{
if(i==0)
{
temp=1;
}
else
{
temp*=(cx-x[i-1]);
}
result+=(a[i][0]*temp);
}
return result;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -