北航研究生数值分析编程大作业3

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数值分析计算实习三

姓名:

学号:

学院:航空科学与工程学院

具体源程序见光盘

一、开发平台的选择

本题中选择VC++ 2008作为开发平台,利用VC++作为开发环境,编了一个基于MFC 的程序。可以使用Microsoft Visual Studio 2008打开“源文件”文件夹中的“Third.sln ”查看或运行源文件。本程序不仅仅是界面不同,编程的思想和运算的速度都有提高。

其优点是通过设计类,将Gauss 消元法、Newton 迭代法、分片二次差值、最小二乘法等功能封装成类的成员函数,在定义了对象后可以任意调用。这都是利用了封装性。在定义类的对象之后可以方便地调用这些成员变量和成员函数。

应用面向对象的编程思想还有一个最大的优点是可扩展性。想添加或改变功能只需要改动成员函数就行了而不会影响到程序的其他部分。同时,利用MFC 还可以开发出很友好的程序界面。本次程序的初始化界面如下:

图1 程序初始化界面

初始化的界面中会显示题中所给的数表。

二、算法的设计方案

1、求出i x i 08.0=,j y j 05.05.0+=(200,100<<<

2、对于已求出的j i t u ,使用分片二次代数插值,对原题中关于u t z ,,的数表进行插

值,从而得到相应的231个ij z 。将第一步中求出的j i y x ,与之对应,便得到了231个z i =f(x i ,y i )的值。

3、令k 初始值为0并逐渐增大,并使用最小二乘法曲面拟合对z i =f(x i ,y i )进行拟合,得到每次的σ,k 值。当710-<σ时结束计算,输出拟合结果及相应σ,k 值。

4、针对j y i x j i 2.05.0,1.0**+==)5,,2,1,8,,2,1(⋅⋅⋅=⋅⋅⋅=j i ,采用步骤2中的方法计算出),(**j i y x f ,再用步骤3中的方法计算出),(**j i y x p 的值。将这两组值列出并计算绝对误差,以观察),(y x p 逼近),(y x f 的程度。

三、源代码

在光盘中有全部的源代码,请用Microsoft Visual Studio 2008打开。同时还有一个可执行文件可以直接执行。由于有些程序段是MFC 直接生成的,这里没有把那部分程序打出。主要源程序代码如下: 1、Newton 类的设计:

(因为这里应用了Newton 迭代法,故将类的名称暂时取名为Newton 类) 类的头文件为:

#pragma once //使此文件只编译一次

#define ACCURACY 1.0e-12//定义精度

#define sigma 1.0e-7//定义计算sigma 时的精度

#define n 4//方程组中方程的个数

class CNewton {

public ://定义成员变量

double x [11],y [21];//需要输出的xi,yi double m_Sigma [100];//存储σ的的数组 double x1[8],y1[5];//存储x*,y*的数组 public :

CNewton (void ); ~CNewton (void ); //求解向量行范数

double Get_Norm (double a [n ]);

//利用选主元高斯消去法求解Newton法中的线性方程组

void Gauss(double f[n],double daof[n][n],double x[n]);

//牛顿迭代法

void Newton(double x[11],double y[21],double u[11*21],double

t[11*21]);

//分片二次差值

double Fenpian(double uu,double tt);

//利用LU分解法求解逆矩阵列向量

void Doolittle(double A[10][10],double b[10],double x[10],int N);

//矩阵求逆

void Matrix_Inversion(double a[10][10],int K);

//最小二乘拟合

int Least_Squares_Collocation(double x[11],double y[21],double

z[11][21],double C[10][21]);

};

类的实现文件为:

#include"StdAfx.h"//程序总的头文件

#include"Newton.h"//将Newton类的头文件包含进来

#include

CNewton::CNewton(void)//类的默认构造函数

{

int i,j;

for(i=0;i<11;i++)

x[i]=0.08*i;

for(i=0;i<21;i++)

y[i]=0.5+0.05*i;

for (i=0;i<100;i++)

{m_Sigma[i]=0;}

for(i=0;i<8;i++)

x1[i]=0.1*(i+1);

for(j=0;j<5;j++)

y1[j]=0.5+0.2*(j+1);

}

CNewton::~CNewton(void)//类的默认析构函数

{}

double CNewton::Get_Norm(double a[n])//求解向量行范数

{

int i;

double max;

max=fabs(a[0]);

相关文档
最新文档