数值分析实验报告.docx
《数值分析实验报告.docx》由会员分享,可在线阅读,更多相关《数值分析实验报告.docx(22页珍藏版)》请在冰点文库上搜索。
![数值分析实验报告.docx](https://file1.bingdoc.com/fileroot1/2023-5/5/e85153e0-4aba-4322-8741-be4ffa17f68f/e85153e0-4aba-4322-8741-be4ffa17f68f1.gif)
数值分析实验报告
实验报告
实验课程:
数值分析
学生姓名:
学号:
专业班级:
2011年6月11日
南昌大学实验报告
---
(1)利用贝塞尔插值绘制字母“T”
学生姓名学号专业班级:
实验类型:
■验证□综合□设计□创新实验日期:
实验成绩:
1、实验目的
掌握贝塞尔插值方法,并能够利用该方法实现曲线的制作。
2、实验内容
利用贝塞尔曲线的插值方法,并根据相关数据,设计程序制作字母“T”和”5”。
3、实验要求
1根据实验中所给的坐标绘制出该字母“T”和”5”。
四、主要实验步骤及处理结果
(1)通过VC++6.0建立一个“helloworld”程序,在其中的源文件中加入“T”和“5”的实验数据和代码,调用API函数中的贝塞尔函数,绘出“T”和“5”的字形。
(2)在函数LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)后添加实验数据和代码如下:
HP[15][3]={{{237,42},{237,542},{237,542}},
{{237,627},{226,638},{143,643}},
{{143,643},{143,662},{143,662}},
{{143,662},{435,662},{435,662}},
{{435,662},{435,643},{435,643}},
{{353,639},{339,626},{339,553}},
{{339,554},{339,42},{339,42}},
{{507,42},{529,60},{552,170}},
{{552,170},{576,170},{576,170}},
{{576,170},{570,0},{570,0}},
{{570,0},{6,0},{6,0}},
{{6,0},{0,170},{0,170}},
{{0,170},{24,170},{24,170}},
{{48,60},{71,42},{183,42}},
{{183,42},{237,42},{237,42}}};
实验添加代码如下:
MoveToEx(hdc,237,42,NULL);
PolyBezierTo(hdc,HP[0],3);
PolyBezierTo(hdc,HP[1],3);
PolyBezierTo(hdc,HP[2],3);
PolyBezierTo(hdc,HP[3],3);
PolyBezierTo(hdc,HP[4],3);
PolyBezierTo(hdc,HP[5],3);
PolyBezierTo(hdc,HP[6],3);
PolyBezierTo(hdc,HP[7],3);
PolyBezierTo(hdc,HP[8],3);
PolyBezierTo(hdc,HP[9],3);
PolyBezierTo(hdc,HP[10],3);
PolyBezierTo(hdc,HP[11],3);
PolyBezierTo(hdc,HP[12],3);
PolyBezierTo(hdc,HP[13],3);
PolyBezierTo(hdc,HP[14],3)
绘制”T”字形实验实验代码如下:
#include"stdafx.h"
#include"T.h"
#defineMAX_LOADSTRING100
//GlobalVariables:
HINSTANCEhInst;//currentinstance
TCHARszTitle[MAX_LOADSTRING];//Thetitlebartext
TCHARszWindowClass[MAX_LOADSTRING];//Thetitlebartext
//Fowarddeclarationsoffunctionsincludedinthiscodemodule:
ATOMMyRegisterClass(HINSTANCEhInstance);
BOOLInitInstance(HINSTANCE,int);
LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);
LRESULTCALLBACKAbout(HWND,UINT,WPARAM,LPARAM);
LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)
{
intwmId,wmEvent;
PAINTSTRUCTps;
HDChdc;
POINTHP[15][3]={{{237,42},{237,542},{237,542}},{{237,627},{226,638},{143,643}},{{143,643},{143,662},{143,662}},
{{143,662},{435,662},{435,662}},{{435,662},{435,643},{435,643}},{{353,639},{339,626},{339,553}},
{{339,554},{339,42},{339,42}},{{507,42},{529,60},{552,170}},{{552,170},{576,170},{576,170}},
{{576,170},{570,0},{570,0}},{{570,0},{6,0},{6,0}},{{6,0},{0,170},{0,170}},
{{0,170},{24,170},{24,170}},{{48,60},{71,42},{183,42}},{{183,42},{237,42},{237,42}}};
POINTT_SHAPE;
TCHARszHello[MAX_LOADSTRING];
LoadString(hInst,IDS_HELLO,szHello,MAX_LOADSTRING);
switch(message)
{
caseWM_COMMAND:
wmId=LOWORD(wParam);
wmEvent=HIWORD(wParam);
//Parsethemenuselections:
switch(wmId)
{
caseIDM_ABOUT:
DialogBox(hInst,(LPCTSTR)IDD_ABOUTBOX,hWnd,(DLGPROC)About);
break;
caseIDM_EXIT:
DestroyWindow(hWnd);
break;
default:
returnDefWindowProc(hWnd,message,wParam,lParam);
}
break;
caseWM_PAINT:
hdc=BeginPaint(hWnd,&ps);
//TODO:
Addanydrawingcodehere...
/*POINTHP[21][4]={{6,0},{570,0},{576,170},{552,170},{529,60},{507,42},{339,42},{339,626},{353,639},
{435,643},{435,662},{143,662},{143,643},{226,638},{237,627},{237,42},{71,42},{48,60},{24,170},
{0,170},{6,0}};*/
RECTrt;
MoveToEx(hdc,237,42,NULL);
PolyBezierTo(hdc,HP[0],3);
PolyBezierTo(hdc,HP[1],3);
PolyBezierTo(hdc,HP[2],3);
PolyBezierTo(hdc,HP[3],3);
PolyBezierTo(hdc,HP[4],3);
PolyBezierTo(hdc,HP[5],3);
PolyBezierTo(hdc,HP[6],3);
PolyBezierTo(hdc,HP[7],3);
PolyBezierTo(hdc,HP[8],3);
PolyBezierTo(hdc,HP[9],3);
PolyBezierTo(hdc,HP[10],3);
PolyBezierTo(hdc,HP[11],3);
PolyBezierTo(hdc,HP[12],3);
PolyBezierTo(hdc,HP[13],3);
PolyBezierTo(hdc,HP[14],3);
实验结果如下:
#include"stdafx.h"
#include"T.h"
#defineMAX_LOADSTRING100
//GlobalVariables:
HINSTANCEhInst;//currentinstance
TCHARszTitle[MAX_LOADSTRING];//Thetitlebartext
TCHARszWindowClass[MAX_LOADSTRING];//Thetitlebartext
//Fowarddeclarationsoffunctionsincludedinthiscodemodule:
ATOMMyRegisterClass(HINSTANCEhInstance);
BOOLInitInstance(HINSTANCE,int);
LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);
LRESULTCALLBACKAbout(HWND,UINT,WPARAM,LPARAM);
LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)
{
intwmId,wmEvent;
PAINTSTRUCTps;
HDChdc;
POINTFI[21][3]={{{149,105},{149,105},{345,105}},{{761,105},{365,103},{368,96}},{{406,7},{368,96},{406,7}},
{{397,0},{406,7},{397,0}},{{382,21},{372,26},{351,26}},{{351,26},{351,26},{142,26}},
{{33,263},{142,26},{33,263}},{{32,264},{32,266},{32,268}},{{32,274},{35,276},{44,276}},
{{74,276},{109,282},{149,294}},{{269,330},{324,392},{324,494}},{{324,590},{264,665},{185,665}},
{{165,665},{149,658},{119,636}},{{86,612},{65,603},{42,603}},{{14,603},{0,615},{0,640}},
{{0,678},{46,702},{121,702}},{{205,702},{282,675},{333,624}},{{378,579},{399,522},{399,446}},
{{399,375},{381,330},{333,280}},{{288,234},{232,211},{112,190}},{{112,190},{149,105},{149,105}}};
TCHARszHello[MAX_LOADSTRING];
LoadString(hInst,IDS_HELLO,szHello,MAX_LOADSTRING);
switch(message)
{
caseWM_COMMAND:
wmId=LOWORD(wParam);
wmEvent=HIWORD(wParam);
//Parsethemenuselections:
switch(wmId)
{
caseIDM_ABOUT:
DialogBox(hInst,(LPCTSTR)IDD_ABOUTBOX,hWnd,(DLGPROC)About);
break;
caseIDM_EXIT:
DestroyWindow(hWnd);
break;
default:
returnDefWindowProc(hWnd,message,wParam,lParam);
}
break;
caseWM_PAINT:
hdc=BeginPaint(hWnd,&ps);
//TODO:
Addanydrawingcodehere...
MoveToEx(hdc,149,105,NULL);
PolyBezierTo(hdc,FI[0],3);
PolyBezierTo(hdc,FI[1],3);
PolyBezierTo(hdc,FI[2],3);
PolyBezierTo(hdc,FI[3],3);
PolyBezierTo(hdc,FI[4],3);
PolyBezierTo(hdc,FI[5],3);
PolyBezierTo(hdc,FI[6],3);
PolyBezierTo(hdc,FI[7],3);
PolyBezierTo(hdc,FI[8],3);
PolyBezierTo(hdc,FI[9],3);
PolyBezierTo(hdc,FI[10],3);
PolyBezierTo(hdc,FI[11],3);
PolyBezierTo(hdc,FI[12],3);
PolyBezierTo(hdc,FI[13],3);
PolyBezierTo(hdc,FI[14],3);
PolyBezierTo(hdc,FI[15],3);
PolyBezierTo(hdc,FI[16],3);
PolyBezierTo(hdc,FI[17],3);
PolyBezierTo(hdc,FI[18],3);
PolyBezierTo(hdc,FI[19],3);
PolyBezierTo(hdc,FI[20],3);
RECTrt;
GetClientRect(hWnd,&rt);
DrawText(hdc,szHello,strlen(szHello),&rt,DT_CENTER);
EndPaint(hWnd,&ps);
break;
caseWM_DESTROY:
PostQuitMessage(0);
break;
default:
returnDefWindowProc(hWnd,message,wParam,lParam);
}
return0;
}
(3)在代码LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam)
下添加实验数据如下:
HP[15][3]={{{237,42},{237,542},{237,542}},{{237,627},{226,638},{143,643}},{{143,643},{143,662},{143,662}},
{{143,662},{435,662},{435,662}},{{435,662},{435,643},{435,643}},{{353,639},{339,626},{339,553}},
{{339,554},{339,42},{339,42}},{{507,42},{529,60},{552,170}},{{552,170},{576,170},{576,170}},
{{576,170},{570,0},{570,0}},{{570,0},{6,0},{6,0}},{{6,0},{0,170},{0,170}},
{{0,170},{24,170},{24,170}},{{48,60},{71,42},{183,42}},{{183,42},{237,42},{237,42}}};
添加实验代码如下:
MoveToEx(hdc,237,42,NULL);
PolyBezierTo(hdc,HP[0],3);
PolyBezierTo(hdc,HP[1],3);
PolyBezierTo(hdc,HP[2],3);
PolyBezierTo(hdc,HP[3],3);
PolyBezierTo(hdc,HP[4],3);
PolyBezierTo(hdc,HP[5],3);
PolyBezierTo(hdc,HP[6],3);
PolyBezierTo(hdc,HP[7],3);
PolyBezierTo(hdc,HP[8],3);
PolyBezierTo(hdc,HP[9],3);
PolyBezierTo(hdc,HP[10],3);
PolyBezierTo(hdc,HP[11],3);
PolyBezierTo(hdc,HP[12],3);
PolyBezierTo(hdc,HP[13],3);
PolyBezierTo(hdc,HP[14],3);
南昌大学实验报告
---
(2)迭代法求方程组的解
学生姓名:
学号:
专业班级:
实验类型:
■验证□综合□设计□创新实验日期:
11.6.11实验成绩:
1、实验目的
1.掌握雅克比迭代方法求线性方程组的解
2.掌握高斯-赛德尔迭代求解线性方程组。
二、实验内容
编写程序实现雅克比迭代和高斯-赛德尔迭代求线性方程组
3、实验要求
1.了解迭代法求解线性方程的要求
2.了解迭代法求解线性方程组的优点和缺点
3.通过改进的迭代法理解各种算法的迭代速度
四、主要实验步骤及处理结果
雅克比算法设计思想:
首先需要对方程组进行变换使其变成X(k+1)=BX(k)+f的形式,使用一个二维数组A[N][N]存放系数矩阵,使用一个一维数组b[N]存放解向量(矩阵),再分别用K,K1两个一维矩阵存放迭代的解向量。
最后按照雅克比迭代思想不断进行迭代直到满足所需精度.
雅克比迭代主要代码:
#definecontrol13e-9//迭代所要达到的精度
#defineN100
voidmuti_matrix(doublea[][N],doubleb[],introw);//该函数为矩阵相乘是迭代的主调函数之一
voidadd_matrix(doublea[],doubleb[],introw);//该函数实现矩阵相加,也是主调函数
doubleSelectmax_row(doublea[],doubleb[],intn);//求矩阵的行范数,当范数达到所需精度时迭代终止。
boolis_ok(doublea[][N],intn);//判断迭代是否收敛
intmain()
{
doubleA[N][N]={0};//存放初始时的系数矩阵(为进行转换)
doubleb[N]={0};//存放各方程式的解向量
doubleK[N]={0};//存放X初始向量
doubleK1[N];//存放每次计算的前一个解向量,主要为计算行范数.
inti,j;
intn;
doublevalue=0;
doublecondition=10000;
printf("请输入矩阵的阶数:
");
scanf("%d",&n);
printf("请输入你要输入的各方程组的系数(按矩阵方式输入):
\n");
for(i=0;iprintf("\t");
for(j=0;jscanf("%lf",&A[i][j]);
}
printf("请输入各方程式的解向量:
\n\t");
for(i=0;iscanf("%lf",&b[i]);
for(i=0;ib[i]=b[i]/A[i][i];
value=A[i][i];
for(j=0;jA[i][j]=-A[i][j]/value;
A[i][i]=0;
}
printf("输出计算后的初始矩阵:
\n");
for(i=0;iprintf("\n");
for(j=0;jprintf("%.3lf",A[i][j]);
}
printf("\n");
if(!
is_ok(A,n)){//判断迭代是否满足迭代的条件
printf("迭代不收敛\n");
exit(0);
}
printf("请输出计算后的b向量(也就是f)\n");
for(i=0;iprintf("%.3lf",b[i]);
printf("\n");
printf("请输入迭代的初始矩阵K2:
\n");
for(i=0;iscanf("%lf",&K[i]);
while(condition>control){//condition为精度要求的控制条件
for(i=0;iK1[i]=K[i];
muti_matrix(A,K,n);
add_matrix(K,b,n);
condition=Selectmax_row(K,K1,n);
printf("请输出计算后的初始矩阵:
\n");
for(i=0;iprintf("%.8lf",K[i]);
}
printf("矩阵的范数:
%.8lf",Selectmax_row(K,K1,n)