1341901124武易计算方法.docx
- 文档编号:29985775
- 上传时间:2023-08-04
- 格式:DOCX
- 页数:97
- 大小:266.48KB
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];
vector
vector
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);
staticvector
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 /* 坐标转换函数,将逻辑坐标转换为窗体坐标 */ POINTLConvertToW(POINToriWin,POINTlp); /* vector中的所有值转换为window坐标 */ voidvLConverToW(vector staticboolcomp(constPOINT&p1,constPOINT&p2); staticboolbinaryPred(constPOIN
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 1341901124 计算方法