1341901124武易计算方法.docx
《1341901124武易计算方法.docx》由会员分享,可在线阅读,更多相关《1341901124武易计算方法.docx(97页珍藏版)》请在冰豆网上搜索。
1341901124武易计算方法
计算方法实验报告
1341901124武易计算机科学与技术
实验一——插值方法
一实验目的
通过本次上机实习,能够进一步加深对各种插值算法的理解;学会使用用三种类型的插值函数的数学模型、基本算法,结合相应软件(如VC/VB/Delphi/Matlab/JAVA/TurboC)编程实现数值方法的求解。
并用该软件的绘图功能来显示插值函数,使其计算结果更加直观和形象化。
二实验内容
通过程序求出插值函数的表达式是比较麻烦的,常用的方法是描出插值曲线上尽量密集的有限个采样点,并用这有限个采样点的连线,即折线,近似插值曲线。
取点越密集,所得折线就越逼近理论上的插值曲线。
本实验中将所取的点的横坐标存放于动态数组
中,通过插值方法计算得到的对应纵坐标存放于动态数组
中。
三源程序清单
Cahzhi.cpp
//cahzhi.cpp:
定义应用程序的入口点。
//
#include"stdafx.h"
#include"cahzhi.h"
#include"resource.h"
#include"defSelf.h"
#include
#include
usingnamespacestd;
#defineMAX_LOADSTRING100
//全局变量:
HINSTANCEhInst;//当前实例
WCHARszTitle[MAX_LOADSTRING];//标题栏文本
WCHARszWindowClass[MAX_LOADSTRING];//主窗口类名
WCHARerrorMsg[MAX_LOADSTRING];
vectorvp;//取点
vectorwvp;//相应窗体点
POINToriWin;//原点
//此代码模块中包含的函数的前向声明:
ATOMMyRegisterClass(HINSTANCEhInstance);
BOOLInitInstance(HINSTANCE,int);
LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);
INT_PTRCALLBACKAbout(HWND,UINT,WPARAM,LPARAM);
intAPIENTRYwWinMain(_In_HINSTANCEhInstance,
_In_opt_HINSTANCEhPrevInstance,
_In_LPWSTRlpCmdLine,
_In_intnCmdShow)
{
UNREFERENCED_PARAMETER(hPrevInstance);
UNREFERENCED_PARAMETER(lpCmdLine);
//TODO:
在此放置代码。
//初始化全局字符串
LoadStringW(hInstance,IDS_APP_TITLE,szTitle,MAX_LOADSTRING);
LoadStringW(hInstance,IDC_CAHZHI,szWindowClass,MAX_LOADSTRING);
LoadStringW(hInstance,IDS_ERROR,errorMsg,MAX_LOADSTRING);
MyRegisterClass(hInstance);
//执行应用程序初始化:
if(!
InitInstance(hInstance,nCmdShow))
{
returnFALSE;
}
HACCELhAccelTable=LoadAccelerators(hInstance,MAKEINTRESOURCE(IDC_CAHZHI));
MSGmsg;
//主消息循环:
while(GetMessage(&msg,nullptr,0,0))
{
if(!
TranslateAccelerator(msg.hwnd,hAccelTable,&msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return(int)msg.wParam;
}
//
//函数:
MyRegisterClass()
//
//目的:
注册窗口类。
//
ATOMMyRegisterClass(HINSTANCEhInstance)
{
WNDCLASSEXWwcex;
wcex.cbSize=sizeof(WNDCLASSEX);
wcex.style=CS_HREDRAW|CS_VREDRAW;
wcex.lpfnWndProc=WndProc;
wcex.cbClsExtra=0;
wcex.cbWndExtra=0;
wcex.hInstance=hInstance;
wcex.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_CAHZHI));
wcex.hCursor=LoadCursor(nullptr,IDC_ARROW);
wcex.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName=MAKEINTRESOURCEW(IDC_CAHZHI);
wcex.lpszClassName=szWindowClass;
wcex.hIconSm=LoadIcon(wcex.hInstance,MAKEINTRESOURCE(IDI_SMALL));
returnRegisterClassExW(&wcex);
}
//
//函数:
InitInstance(HINSTANCE,int)
//
//目的:
保存实例句柄并创建主窗口
//
//注释:
//
//在此函数中,我们在全局变量中保存实例句柄并
//创建和显示主程序窗口。
//
BOOLInitInstance(HINSTANCEhInstance,intnCmdShow)
{
hInst=hInstance;//将实例句柄存储在全局变量中
HWNDhWnd=CreateWindowW(szWindowClass,szTitle,WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,0,CW_USEDEFAULT,0,nullptr,nullptr,hInstance,nullptr);
if(!
hWnd)
{
returnFALSE;
}
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
returnTRUE;
}
//
//函数:
WndProc(HWND,UINT,WPARAM,LPARAM)
//
//目的:
处理主窗口的消息。
//
//WM_COMMAND-处理应用程序菜单
//WM_PAINT-绘制主窗口
//WM_DESTROY-发送退出消息并返回
//
//
LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)
{
staticintcxClient,cyClient;
staticPOINTcurPoint;
staticuint16_tchoiceL=0,choiceN=0,choiceS=0;
staticTCHARcurCoor[10];
staticintcoorLen;
staticRECTtxtRect;
SetRect(&txtRect,0,0,100,20);
vLConverToW(vp,oriWin,wvp);
staticvectorvpDeal;
vpDeal.clear();
vpDeal=pointDeal(vp);
switch(message)
{
caseWM_COMMAND:
{
intwmId=LOWORD(wParam);
//分析菜单选择:
switch(wmId)
{
caseID_RDPT:
rnPointCt(vp,-cxClient/2,cxClient/2,-cyClient/2,cyClient/2,5);
InvalidateRect(hWnd,NULL,true);
break;
caseID_LARGERANGE:
if(vp.size()){
choiceL=true;
InvalidateRect(hWnd,NULL,false);
}
break;
caseID_NEWTON:
if(vp.size()){
choiceN=true;
InvalidateRect(hWnd,NULL,false);
}
break;
caseID_SPLINE:
if(vp.size()){
choiceS=true;
InvalidateRect(hWnd,NULL,false);
}
break;
caseID_CLEAR:
vp.clear();
choiceL=choiceN=choiceS=false;
InvalidateRect(hWnd,NULL,true);
break;
caseIDM_ABOUT:
DialogBox(hInst,MAKEINTRESOURCE(IDD_ABOUTBOX),hWnd,About);
break;
caseIDM_EXIT:
DestroyWindow(hWnd);
break;
default:
returnDefWindowProc(hWnd,message,wParam,lParam);
}
}
break;
caseWM_SIZE:
{
cxClient=LOWORD(lParam);
cyClient=HIWORD(lParam);
oriWin.x=cxClient/2;
oriWin.y=cyClient/2;
}
break;
caseWM_LBUTTONDOWN:
{
curPoint.x=LOWORD(lParam)-oriWin.x;
curPoint.y=oriWin.y-HIWORD(lParam);
vp.push_back(curPoint);
InvalidateRect(hWnd,NULL,true);
}
break;
caseWM_MOUSEMOVE:
{
curPoint.x=LOWORD(lParam)-oriWin.x;
curPoint.y=oriWin.y-HIWORD(lParam);
InvalidateRect(hWnd,&txtRect,true);
}
break;
caseWM_PAINT:
{
PAINTSTRUCTps;
HDChdc=BeginPaint(hWnd,&ps);
//TODO:
在此处添加使用hdc的任何绘图代码...
//创建并选中画笔和画刷
HPENhPen,hOldPen;
LOGBRUSHlogBrush;
HBRUSHhBrush,hOldBrush;
hPen=CreatePen(PS_SOLID,1,RGB(0,0,0));
hOldPen=(HPEN)SelectObject(hdc,hPen);
logBrush.lbColor=RGB(10,220,10);
logBrush.lbHatch=HS_CROSS;
logBrush.lbStyle=BS_SOLID;
hBrush=CreateBrushIndirect(&logBrush);
hOldBrush=(HBRUSH)SelectObject(hdc,hBrush);
//cursor
coorLen=wsprintf(curCoor,TEXT("(%d,%d)"),curPoint.x,curPoint.y);
DrawText(hdc,curCoor,coorLen,&txtRect,DT_CENTER);
//绘坐标
//x轴
MoveToEx(hdc,0,cyClient/2,NULL);
LineTo(hdc,cxClient,cyClient/2);
LineTo(hdc,cxClient-5,cyClient/2-5);
MoveToEx(hdc,cxClient,cyClient/2,NULL);
LineTo(hdc,cxClient-5,cyClient/2+5);
TextOut(hdc,cxClient-10,cyClient/2+5,TEXT("x"),1);
//y轴
MoveToEx(hdc,cxClient/2,cyClient,NULL);
LineTo(hdc,cxClient/2,0);
LineTo(hdc,cxClient/2-5,5);
MoveToEx(hdc,cxClient/2,0,NULL);
LineTo(hdc,cxClient/2+5,5);
TextOut(hdc,cxClient/2+5,5,TEXT("y"),1);
TextOut(hdc,cxClient/2-10,cyClient/2+5,TEXT("O"),1);
//绘说明
hPen=(HPEN)SelectObject(hdc,CreatePen(PS_SOLID,1,RGB(255,25,25)));
MoveToEx(hdc,8*cxClient/10,cyClient/10,NULL);
LineTo(hdc,9*cxClient/10,cyClient/10);
TextOut(hdc,9*cxClient/10+5,cyClient/10-6,TEXT("Largrange"),9);
DeleteObject(SelectObject(hdc,hPen));
hPen=(HPEN)SelectObject(hdc,CreatePen(PS_SOLID,1,RGB(25,255,25)));
MoveToEx(hdc,8*cxClient/10,cyClient/10+20,NULL);
LineTo(hdc,9*cxClient/10,cyClient/10+20);
TextOut(hdc,9*cxClient/10+5,cyClient/10+20-6,TEXT("Newton"),6);
DeleteObject(SelectObject(hdc,hPen));
hPen=(HPEN)SelectObject(hdc,CreatePen(PS_SOLID,1,RGB(25,25,255)));
MoveToEx(hdc,8*cxClient/10,cyClient/10+40,NULL);
LineTo(hdc,9*cxClient/10,cyClient/10+40);
TextOut(hdc,9*cxClient/10+5,cyClient/10+40-6,TEXT("Spline"),6);
DeleteObject(SelectObject(hdc,hPen));
//绘随机点
for(size_ti=0;i{
Ellipse(hdc,wvp[i].x-3,wvp[i].y-3,wvp[i].x+3,wvp[i].y+3);
}
//绘插值曲线
if(choiceL)
{
POINTtPoint;
hPen=(HPEN)SelectObject(hdc,CreatePen(PS_SOLID,1,RGB(255,25,25)));
MoveToEx(hdc,-5,0,NULL);
for(intx=-cxClient/2;x{
tPoint.x=x;
tPoint.y=Largrange(vpDeal,tPoint.x);
LineTo(hdc,LConvertToW(oriWin,tPoint).x,LConvertToW(oriWin,tPoint).y);
}
DeleteObject(SelectObject(hdc,hPen));
}
if(choiceN){
POINTtPoint;
hPen=(HPEN)SelectObject(hdc,CreatePen(PS_SOLID,1,RGB(25,255,25)));
MoveToEx(hdc,-5,0,NULL);
for(intx=-cxClient/2;x{
tPoint.x=x;
tPoint.y=Newton(vpDeal,tPoint.x);
LineTo(hdc,LConvertToW(oriWin,tPoint).x,LConvertToW(oriWin,tPoint).y);
}
DeleteObject(SelectObject(hdc,hPen));
}
if(choiceS){
POINTtPoint;
hPen=(HPEN)SelectObject(hdc,CreatePen(PS_SOLID,1,RGB(25,25,255)));
for(intx=vpDeal[0].x,i=0;x<=vpDeal[vp.size()-1].x;x++,i++)
{
tPoint.x=x;
tPoint.y=spline(10,vpDeal,-10,tPoint.x);
if(i==0)
MoveToEx(hdc,LConvertToW(oriWin,tPoint).x,LConvertToW(oriWin,tPoint).y,NULL);
LineTo(hdc,LConvertToW(oriWin,tPoint).x,LConvertToW(oriWin,tPoint).y);
}
DeleteObject(SelectObject(hdc,hPen));
}
DeleteObject(hPen);
SelectObject(hdc,hOldPen);
DeleteObject(hBrush);
SelectObject(hdc,hOldBrush);
EndPaint(hWnd,&ps);
}
break;
caseWM_DESTROY:
PostQuitMessage(0);
break;
default:
returnDefWindowProc(hWnd,message,wParam,lParam);
}
return0;
}
//“关于”框的消息处理程序。
INT_PTRCALLBACKAbout(HWNDhDlg,UINTmessage,WPARAMwParam,LPARAMlParam)
{
UNREFERENCED_PARAMETER(lParam);
switch(message)
{
caseWM_INITDIALOG:
return(INT_PTR)TRUE;
caseWM_COMMAND:
if(LOWORD(wParam)==IDOK||LOWORD(wParam)==IDCANCEL)
{
EndDialog(hDlg,LOWORD(wParam));
return(INT_PTR)TRUE;
}
break;
}
return(INT_PTR)FALSE;
}
defSelf.h
#pragmaonce
#include
#include
#defineFIA(X)(X-1)*(X-1)*(2*X+1)
#defineFIB(X)X*X*((-2)*X+3)
#defineXIA(X)X*(X-1)*(X-1)
#defineXIB(X)X*X*(X-1)
usingstd:
:
vector;
/*
随机生成num个点,放入vp;
*/
voidrnPointCt(vector&vp,intpxMin,intpxMax,intpyMin,intpyMax,intnum);
/*
坐标转换函数,将逻辑坐标转换为窗体坐标
*/
POINTLConvertToW(POINToriWin,POINTlp);
/*
vector中的所有值转换为window坐标
*/
voidvLConverToW(vector&vp,POINToriWin,vector&wvp);
staticboolcomp(constPOINT&p1,constPOINT&p2);
staticboolbinaryPred(constPOIN