《数值分析》实验报告.docx
- 文档编号:24524297
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:18
- 大小:33.79KB
《数值分析》实验报告.docx
《《数值分析》实验报告.docx》由会员分享,可在线阅读,更多相关《《数值分析》实验报告.docx(18页珍藏版)》请在冰豆网上搜索。
《数值分析》实验报告
《数值分析》实验报告
实验序号:
实验五题目名称:
分段线性插值法
学号:
2010104200姓名:
葛广帅
任课教师:
马季骕专业班级:
10计科(非师范)
1、实验目的:
学会使用分段线性插值的方法求原函数的逼近函数。
2、实验内容:
当给出了n+1个节点上f(x)的一张函数表后,用分段线性插值法求一个函数φ(x),并满足φ(x)是一个不超过n次的多项式;
当插值节点取的足够多时逼近函数φ(x)能够很好的逼近被逼近函数f(x)。
而插值函数φ(x)的次数就会相应地升高,高次的插值多项式收敛到相应的被逼近函数。
所取的n值越大,逼近的越准确。
3、实验代码:
//TestDlg.cpp:
implementationfile
//
#include"stdafx.h"
#include"Test.h"
#include"TestDlg.h"
#definef(x)(1.0/(1+25*x*x))
#defineff(x)(-50*x/((1+25*x*x)*(1+25*x*x)))
#defineROUND(x)(int(x+0.5))
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CAboutDlgdialogusedforAppAbout
classCAboutDlg:
publicCDialog
{
public:
CAboutDlg();
//DialogData
//{{AFX_DATA(CAboutDlg)
enum{IDD=IDD_ABOUTBOX};
//}}AFX_DATA
//ClassWizardgeneratedvirtualfunctionoverrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg:
:
CAboutDlg():
CDialog(CAboutDlg:
:
IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
voidCAboutDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
//Nomessagehandlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CTestDlgdialog
CTestDlg:
:
CTestDlg(CWnd*pParent/*=NULL*/)
:
CDialog(CTestDlg:
:
IDD,pParent)
{
//{{AFX_DATA_INIT(CTestDlg)
//NOTE:
theClassWizardwilladdmemberinitializationhere
//}}AFX_DATA_INIT
//NotethatLoadIcondoesnotrequireasubsequentDestroyIconinWin32
op=-1;
inti;
for(i=0;i<=10;i++)
{
X[i]=-1+0.2*i;
Y[i]=f(X[i]);
YY[i]=ff(X[i]);
}
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
voidCTestDlg:
:
DoDataExchange(CDataExchange*pDX)
{
CDialog:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTestDlg)
//NOTE:
theClassWizardwilladdDDXandDDVcallshere
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTestDlg,CDialog)
//{{AFX_MSG_MAP(CTestDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_Lagrange,OnLagrange)
ON_BN_CLICKED(IDC_Faber,OnFaber)
ON_BN_CLICKED(IDC_Hermite,OnHermite)
ON_BN_CLICKED(IDC_Yuan,OnYuan)
ON_BN_CLICKED(IDC_All,OnAll)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CTestDlgmessagehandlers
BOOLCTestDlg:
:
OnInitDialog()
{
CDialog:
:
OnInitDialog();
//Add"About..."menuitemtosystemmenu.
//IDM_ABOUTBOXmustbeinthesystemcommandrange.
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
CStringstrAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!
strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
//Settheiconforthisdialog.Theframeworkdoesthisautomatically
//whentheapplication'smainwindowisnotadialog
SetIcon(m_hIcon,TRUE);//Setbigicon
SetIcon(m_hIcon,FALSE);//Setsmallicon
//TODO:
Addextrainitializationhere
returnTRUE;//returnTRUEunlessyousetthefocustoacontrol
}
voidCTestDlg:
:
OnSysCommand(UINTnID,LPARAMlParam)
{
if((nID&0xFFF0)==IDM_ABOUTBOX)
{
CAboutDlgdlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog:
:
OnSysCommand(nID,lParam);
}
}
//Ifyouaddaminimizebuttontoyourdialog,youwillneedthecodebelow
//todrawtheicon.ForMFCapplicationsusingthedocument/viewmodel,
//thisisautomaticallydoneforyoubytheframework.
voidCTestDlg:
:
OnPaint()
{
CClientDCdc(this);
rgb=dc.GetPixel(50,50);
CRectRect;
GetClientRect(&Rect);
width=Rect.Width()/2;
height=Rect.Height()/2;
dc.MoveTo(200,height);
dc.LineTo(2*width-200,height);
dc.MoveTo(2*width-200,height);
dc.LineTo(2*width-210,height+10);
dc.MoveTo(2*width-200,height);
dc.LineTo(2*width-210,height-10);
dc.TextOut(2*width-195,height,"X轴");
dc.MoveTo(width,10);
dc.LineTo(width,2*height-10);
dc.MoveTo(width,10);
dc.LineTo(width+10,20);
dc.MoveTo(width,10);
dc.LineTo(width-10,20);
dc.TextOut(width+10,10,"Y轴");
//fun();
CPennewpen0;
newpen0.CreatePen(PS_SOLID,1,RGB(0,0,0));
CPen*oldpen0=dc.SelectObject(&newpen0);
dc.MoveTo(2*width-150,30);
dc.LineTo(2*width-50,30);
dc.SelectObject(oldpen0);
CPennewpen1;
newpen1.CreatePen(PS_SOLID,1,RGB(255,0,0));
CPen*oldpen1=dc.SelectObject(&newpen1);
dc.MoveTo(2*width-150,80);
dc.LineTo(2*width-50,80);
dc.SelectObject(oldpen1);
CPennewpen2;
newpen2.CreatePen(PS_SOLID,1,RGB(0,0,255));
CPen*oldpen2=dc.SelectObject(&newpen2);
dc.MoveTo(2*width-150,140);
dc.LineTo(2*width-50,140);
dc.SelectObject(oldpen2);
CPennewpen3;
newpen3.CreatePen(PS_SOLID,1,RGB(0,255,0));
CPen*oldpen3=dc.SelectObject(&newpen3);
dc.MoveTo(2*width-150,200);
dc.LineTo(2*width-50,200);
dc.SelectObject(oldpen3);
switch(op)
{
case0:
Lagrange1();
OnFaber2();
OnHermite3();
Yuan0();
break;
case1:
OnFaber2();
OnHermite3();
Yuan0();
Lagrange1();
break;
case2:
Lagrange1();
OnHermite3();
Yuan0();
OnFaber2();
break;
case3:
Lagrange1();
OnFaber2();
Yuan0();
OnHermite3();
break;
case4:
Yuan0();
Lagrange1();
OnFaber2();
OnHermite3();
break;
}
if(IsIconic())
{
CPaintDCdc(this);//devicecontextforpainting
SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);
//Centericoninclientrectangle
intcxIcon=GetSystemMetrics(SM_CXICON);
intcyIcon=GetSystemMetrics(SM_CYICON);
CRectrect;
GetClientRect(&rect);
intx=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
//Drawtheicon
dc.DrawIcon(x,y,m_hIcon);
}
else
{
CDialog:
:
OnPaint();
}
}
//Thesystemcallsthistoobtainthecursortodisplaywhiletheuserdrags
//theminimizedwindow.
HCURSORCTestDlg:
:
OnQueryDragIcon()
{
return(HCURSOR)m_hIcon;
}
intCTestDlg:
:
movex(intx)
{
returnx+width;
}
intCTestDlg:
:
movey(inty)
{
return-y+height;
}
voidCTestDlg:
:
fun()
{
inti;
for(i=0;i<=10;i++)
{
X[i]=-1+0.2*i;
Y[i]=f(X[i]);
YY[i]=ff(X[i]);
}
}
voidCTestDlg:
:
OnLagrange()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
op=1;
rgb0=RGB(0,0,0);
rgb1=RGB(255,0,0);
rgb2=rgb;
rgb3=rgb;
OnPaint();
}
voidCTestDlg:
:
OnFaber()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
op=2;
rgb0=RGB(0,0,0);
rgb2=RGB(0,0,255);
rgb1=rgb;
rgb3=rgb;
OnPaint();
}
voidCTestDlg:
:
OnHermite()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
op=3;
rgb0=RGB(0,0,0);
rgb3=RGB(0,255,0);
rgb2=rgb;
rgb1=rgb;
OnPaint();
}
voidCTestDlg:
:
Lagrange1()
{
CClientDCdc(this);
doubletempx,tempy;
tempx=-1;
intj;
while(tempx<=1)
{
tempy=0;
for(j=0;j<=10;j++)
{
tempy=tempy+Y[j]*L(tempx,j);
}
dc.SetPixel(movex(ROUND(tempx*150)),movey(ROUND(tempy*150)),rgb1);
tempx=tempx+0.00001;
}
}
doubleCTestDlg:
:
L(doublex,intj)
{
doubletemp;
inti;
temp=1;
for(i=0;i<=10;i++)
{
if(i!
=j)
{
temp=temp*(x-X[i]);
temp=temp/(X[j]-X[i]);
}
}
returntemp;
}
voidCTestDlg:
:
OnFaber2()
{
CClientDCdc(this);
CPennewpen;
newpen.CreatePen(PS_SOLID,1,rgb2);
CPen*oldpen=dc.SelectObject(&newpen);
doubletempx,tempy;
intj;
for(j=0;j<10;j++)
{
tempx=X[j];
tempy=Y[j];
dc.MoveTo(movex(ROUND(tempx*150)),movey(ROUND(tempy*150)));
tempx=X[j+1];
tempy=Y[j+1];
dc.LineTo(movex(ROUND(tempx*150)),movey(ROUND(tempy*150)));
}
dc.SelectObject(oldpen);
}
voidCTestDlg:
:
OnHermite3()
{
CClientDCdc(this);
doubletempx,tempy,hh0,hh1,HH0,HH1;
intj;
for(j=0;j<10;j++)
{
tempx=X[j];
while(tempx { hh0=h0(j,j+1,tempx); hh1=h1(j,j+1,tempx); HH0=H0(j,j+1,tempx); HH1=H1(j,j+1,tempx); tempy=Y[j]*hh0+Y[j+1]*hh1+YY[j]*HH0+YY[j+1]*HH1; dc.SetPixel(movex(ROUND(tempx*150)),movey(ROUND(tempy*150)),rgb3); tempx=tempx+0.00001; } } } doubleCTestDlg: : h0(inti0,inti1,doublex) { doubletemp; temp=(1+2*(x-X[i0])/(X[i1]-X[i0]))*((x-X[i1])/(X[i0]-X[i1]))*((x-X[i1])/(X[i0]-X[i1])); returntemp; } doubleCTestDlg: : h1(inti0,inti1,doublex) { doubletemp; temp=(1+2*(x-X[i1])/(X[i0]-X[i1]))*((x-X[i0])/(X[i1]-X[i0]))*((x-X[i0])/(X[i1]-X[i0])); returntemp; } doubleCTestDlg: : H0(inti0,inti1,doublex) { doubletemp; temp=(x-X[i0])*((x-X[i1])/(X[i0]-X[i1]))*((x-X[i1])/(X[i0]-X[i1])); returntemp; } doubleCTestDlg: : H1(inti0,inti1,doublex) { doubletemp; temp=(x-X[i1])*((x-X[i0])/(X[i1]-X[i0]))*((x-X[i0])/(X[i1]-X[i0])); returntemp; } voidCTestDlg: : Yuan0() { CClientDCdc(this); doubletempx,tempy; tempx=-1; while(tempx<=1) { tempy=f(tempx); dc.SetPixel(movex(ROUND(tempx*150)),movey(ROUND(tempy*150)),RGB(0,0,0)); tempx=tempx+0.0001; } } voidCTestDlg: : OnYuan() { //TODO: Addyourcontrolnotificationhandlercodehere op=0; rgb0=RGB(0,0,0); rgb3=rgb; rgb2=rgb; rgb1=rgb; OnPaint(); } voidCTestDlg: : OnAll() { //TODO: Addyourcontrolnotificationhandlercodehere op=4; rgb0=RGB(0,0,0); rgb3=RGB(0,255,0); rgb2=RGB(0,0,255); rgb1=RGB(255,0,0); OnPaint(); } 4.结果分析: 分析: 分段线性插值需要在每个插值节点上构造分段线性插值基函数 ,然后再作它们的线 组合。 分段线性插值基函数的特点是在对应的插值节点上函数值取1,其它节点上函数值取0。 插值函数¢(x)叫做区间[a,b]上对数据(x[j],y[j])(j=0,1,2,…
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数值分析 数值 分析 实验 报告