分段线性插值.doc
1、 实验目的:
设在区间[a,b]上,给定n+1个插值节点a=X0
=-1&&x1<=-0.9)
{
n=ay[0]*((x1-ax[1])/(ax[0]-ax[1])); //计算 并和相应的函数值组合
m=n+m;
}
else
1 / 14
{
if(x1>=ax[i-1]&&x1<=ax[i]) //计算 并和相应的函数值组合
{
n=ay[i]*((x1-ax[i-1])/(ax[i]-ax[i-1]));
m=n+m;
}
else
{
if(x1>ax[i]&&x1<=ax[i+1])
{
n=ay[i]*((x1-ax[i+1])/(ax[i]-ax[i+1]));
m=m+n;
}
else
{
if(i==19&&x1>ax[19]&&x1<=ax[20])
{
n=ay[20]*((x1-ax[19])-(ax[20]-ax[19]));//计算 并和相应的函数值组合
m=n+m;
}
}
}
}
}
}
3、 实验结果截图:
在[-1,1]区间上选取了21个等分节点的分段线性插值函数的图像如下:
2 / 14
4、 程序代码
// SHIYAN456View.cpp : implementation of the CSHIYAN456View class
//
#include "stdafx.h"
#include "SHIYAN456.h"
#include "SHIYAN456Doc.h"
#include "SHIYAN456View.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__; #endif
/////////////////////////////////////////////////////////////////////////////
// CSHIYAN456View
3 / 14
IMPLEMENT_DYNCREATE(CSHIYAN456View, CView)
BEGIN_MESSAGE_MAP(CSHIYAN456View, CView)
//{{AFX_MSG_MAP(CSHIYAN456View)
ON_COMMAND(ID_FFunction, OnFFunction)
ON_COMMAND(ID_Lagrange, OnLagrange)
ON_COMMAND(ID_Subsection, OnSubsection)
ON_COMMAND(ID_Hermite, OnHermite)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSHIYAN456View construction/destruction
CSHIYAN456View::CSHIYAN456View()
{
// TODO: add construction code here
}
CSHIYAN456View::~CSHIYAN456View()
{
}
BOOL CSHIYAN456View::PreCreateWindow(CREATESTRUCT& cs)
4 / 14
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs); }
/////////////////////////////////////////////////////////////////////////////
// CSHIYAN456View drawing
void CSHIYAN456View::OnDraw(CDC* pDC) {
CSHIYAN456Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
AfxGetMainWnd()->SetWindowText("实验四五六函数图像");
for(int k=650;k<=690;k++)
{
pDC->SetPixel(k,55,RGB(255,0,0));
pDC->SetPixel(k,85,RGB(0,255,0));
pDC->SetPixel(k,115,RGB(0,0,255));
pDC->SetPixel(k,145,RGB(0,255,255));
}
pDC->TextOut(700,50,"原函数图像");
pDC->TextOut(700,80,"Lagrange插值函数图像");
pDC->TextOut(700,110,"分段线性插值函数图像");
pDC->TextOut(700,140,"Hermite插值函数图像");
for(int i=6;i<=600;i++)
pDC->SetPixel(400,i,RGB(0,0,0));
pDC->TextOut(395,4,"y");
5 / 14
for(int j=100;j<=700;j++)
pDC->SetPixel(j,500,RGB(0,0,0));
pDC->TextOut(700,500,"x");
//pDC->MoveTo(400,500);
}
/////////////////////////////////////////////////////////////////////////////
// CSHIYAN456View printing
BOOL CSHIYAN456View::OnPreparePrinting(CPrintInfo* pInfo) {
// default preparation
return DoPreparePrinting(pInfo);
}
void CSHIYAN456View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) {
// TODO: add extra initialization before printing }
void CSHIYAN456View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) {
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CSHIYAN456View diagnostics
#ifdef _DEBUG
void CSHIYAN456View::AssertValid() const
6 / 14
{
CView::AssertValid();
}
void CSHIYAN456View::Dump(CDumpContext& dc) const {
CView::Dump(dc);
}
CSHIYAN456Doc* CSHIYAN456View::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSHIYAN456Doc)));
return (CSHIYAN456Doc*)m_pDocument; }
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CSHIYAN456View message handlers
void CSHIYAN456View::OnFFunction()
{
// TODO: Add your command handler code here
CClientDC dr(this);
COLORREF rgb=RGB(255,0,0);
double x1,y1,x,y;
x1=-1.0;y1=1/(1+25*x1*x1);
x=x1*200+400;
y=-y1*200+500;
while(x1<=1)
{
7 / 14
dr.MoveTo(int(x),int(y));
x1=x1+0.00001;
y1=1/(1+25*x1*x1);
x=x1*200+400;
y=-y1*200+500;
dr.SetPixel(int(x),int(y),rgb);
}
}
void CSHIYAN456View::OnLagrange() {
// TODO: Add your command handler code here
CClientDC dr(this);
COLORREF rgb=RGB(0,255,0);
int i,j;
double x1=0,y1=0,x=0,y=0,m=0,n=0,ax[100],ay[100];
for(i=0;i<=10;i++)
{
ax[i]=-1+((2/10.0)*i);
ay[i]=1.0/(1+25*ax[i]*ax[i]);
}
x1=-1;y1=1/(1+25*x1*x1);
x=x1*200+400;
y=-y1*200+500;
dr.MoveTo(int(x),int(y));
while(x1<=1)
{
m=0;
for(i=0;i<=10;i++)
{
8 / 14
n=1;
for(j=0;j<=10;j++)
{
if(i!=j)
n=((x1-ax[j])/(ax[i]-ax[j]))*n;
}
m=ay[i]*n+m;
}
x=x1*200+400;
y=-m*200+500;
dr.SetPixel(int(x),int(y),rgb);
x1=x1+0.00001;
}
}
void CSHIYAN456View::OnSubsection() {
// TODO: Add your command handler code here
CClientDC dr(this);
COLORREF rgb=RGB(0,0,255);
int i;
double x1=0,y1=0,x=0,y=0,m=0,n=0,ax[100],ay[100];
for(i=0;i<=20;i++)
{
ax[i]=-1+((2/20.0)*i);
ay[i]=1.0/(1+25*ax[i]*ax[i]);
}
x1=-1;
y1=1/(1+25*x1*x1);
9 / 14
x=x1*200+400;
y=-y1*200+500;
dr.MoveTo(int(x),int(y));
while(x1<=1)
{
m=0;
x1=x1+0.00001;
for(i=0;i<=20;i++)
{
if(i==0&&x1>=-1&&x1<=-0.9)
{
n=ay[0]*((x1-ax[1])/(ax[0]-ax[1]));
m=n+m;
}
else
{
if(x1>=ax[i-1]&&x1<=ax[i])
{
n=ay[i]*((x1-ax[i-1])/(ax[i]-ax[i-1]));
m=n+m;
}
else
{
if(x1>ax[i]&&x1<=ax[i+1])
{
n=ay[i]*((x1-ax[i+1])/(ax[i]-ax[i+1]));
m=m+n;
}
else
{
10 / 14
if(i==19&&x1>ax[19]&&x1<=ax[20])
{
n=ay[20]*((x1-ax[19])-(ax[20]-ax[19]));
m=n+m;
}
}
}
}
}
x=x1*200+400;
y=-m*200+500;
dr.SetPixel(int(x),int(y),rgb);
}
}
void CSHIYAN456View::OnHermite()
{
// TODO: Add your command handler code here
CClientDC dr(this);
COLORREF rgb=RGB(0,255,255);
int i;
double x1=0,y1=0,x=0,y=0,m=0,n=0,tt=0,tt1=0,h=0,ax[100],ay[100],a[100];
for(i=0;i<=10;i++)
{
ax[i]=-1+((2/10.0)*i);
ay[i]=1.0/(1+25*ax[i]*ax[i]);
a[i]=(-50*ax[i])/((1+25*ax[i]*ax[i])*(1+25*ax[i]*ax[i]));
}
x1=-1;
11 / 14
y1=1/(1+25*x1*x1);
x=x1*200+400;
y=-y1*200+500;
dr.MoveTo(int(x),int(y));
while(x1<=1)
{
m=0;
x1=x1+0.00001;
for(i=0;i<=10;i++)
{
if(i==0&&x1>=ax[0]&&x1<=ax[1])
{
n=(1+2*((x1-ax[0])/(ax[1]-ax[0])))*((x1-ax[1])/(ax[0]-ax[1]))
*((x1-ax[1])/(ax[0]-ax[1]));
tt=ay[0]*n;
h=(x1-ax[0])*((x1-ax[1])/(ax[0]-ax[1]))*((x1-ax[1])/(ax[0]-ax[1]));
tt1=a[0]*h;
m=tt+tt1+m;
}
else
{
if(x1>=ax[i-1]&&x1<=ax[i])
{
n=(1+2*((x1-ax[i])/(ax[i-1]-ax[i])))*((x1-ax[i-1])/(ax[i]-ax[i-1]))
*((x1-ax[i-1])/(ax[i]-ax[i-1]));
tt=ay[i]*n;
h=(x1-ax[i])*((x1-ax[i-1])/(ax[i]-ax[i-1]))*((x1-ax[i-1])
/(ax[i]-ax[i-1]));
tt1=a[i]*h;
m=tt+tt1+m;
12 / 14
}
else
{
if(x1>ax[i]&&x1<=ax[i+1])
{
n=(1+2*((x1-ax[i])/(ax[i+1]-ax[i])))*((x1-ax[i+1])
/(ax[i]-ax[i+1]))*((x1-ax[i+1])/(ax[i]-ax[i+1]));
tt=ay[i]*n;
h=(x1-ax[i])*((x1-ax[i+1])/(ax[i]-ax[i+1]))*((x1-ax[i+1])
/(ax[i]-ax[i+1]));
tt1=a[i]*h;
m=tt+tt1+m;
}
else
{
if(i==9&&x1>ax[9]&&x1<=ax[10])
{
n=(1+2*((x1-ax[10])/(ax[9]-ax[10])))*((x1-ax[9])
/(ax[10]-ax[9]))*((x1-ax[9])/(ax[10]-ax[9]));
tt=ay[i]*n;
h=(x1-ax[10])*((x1-ax[9])/(ax[10]-ax[9]))*((x1-ax[9])
/(ax[10]-ax[9]));
tt1=a[i]*h;
m=tt+tt1+m;
}
}
}
}
}
x=x1*200+400;
13 / 14
y=-m*200+500;
dr.SetPixel(int(x),int(y),rgb);
}
}
5、
总结
初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf
体会
针灸治疗溃疡性结肠炎昆山之路icu常用仪器的管理名人广告失败案例两会精神体会
分段线性插值的方法克服了Lagrange插值法当节点不断加密时,构造的插值多项式的次数不断升高,高次多项式虽然是连续的,但是不一定都收敛到相应的被插函数而产生Runge现象。分段线性插值因为在每一段小区间上都是线性插值而极大地降低了插值多项式的次数,从几何图形上可以看出,当节点取得较多时插值函数的逼近效果还是很好的,但是所求函数是一条以型值点为顶点的折线,这也表现出了它的缺点就是所求得的插值函数的光滑性较差,这就要求一种更好的方法来克服这一缺点了。
14 / 14