数值分析在生活中应用举例及Matlab实现

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

一、最小二乘法,用MATLAB实现

1. 数值实例

下面给定地是乌鲁木齐最近1个月早晨7:00左右(新疆时间)地天气预报所得到地温度,按照数据找出任意次曲线拟合方程和它地图像.下面用MATLAB编程对上述数据进行最小

二乘拟合.b5E2RGbCAP

2008年10月26~11月26

天数 1 2 3 4 5 6 7 8 9 10 温度9 10 11 12 13 14 13 12 11 9 天数11 12 13 14 15 16 17 18 19 20 温度10 11 12 13 14 12 11 10 9 8 天数21 22 23 24 25 26 27 28 29 30 温度7 8 9 11 9 7 6 5 3 1 下面用MATLAB编程对上述数据进行最小二乘拟合

2、程序代码

x=[1:1:30];

y=[9,10,11,12,13,14,13,12,11,9,10,11,12,13,14,12,11,10,9,8,7,8,9,11,9,7,6,5,3,1];p1EanqFDPw

a1=polyfit(x,y,3) %三次多项式拟合%

a2= polyfit(x,y,9) %九次多项式拟合%

a3= polyfit(x,y,15) %十五次多项式拟合%

b1=polyval(a1,x)

b2=polyval(a2,x)

b3=polyval(a3,x)

r1= sum((y-b1).^2) %三次多项式误差平方和%

r2= sum((y-b2).^2) %九次次多项式误差平方和%

r3= sum((y-b3).^2) %十五次多项式误差平方和%

plot(x,y,'*') %用*画出x,y图像%

hold on

plot(x,b1, 'r') %用红色线画出x,b1图像%

hold on

plot(x,b2, 'g') %用绿色线画出x,b2图像%

hold on

plot(x,b3, 'b:o') %用蓝色o线画出x,b3图像%

3、数值结果

不同次数多项式拟合误差平方和为:

r1=67.6659

r2=20.1060

r3=3.7952

r1、r2、r3分别表示三次、九次、十五次多项式误差平方和.

4、拟合曲线如下图

二、线性方程组地求解(

高斯-塞德尔迭代算法

1、实例:求解线性方程组(见书

P233页)

36

123633

114

202383

21

3

2

13

21

x

x x

x

x x x x x 记A x=b, 其中

36

3320

,

,123

6

11142383

21b

x

A

x

x x 任取初始值

T

x

00

,进行迭代.

2、用C 语言实现,源程序如下:

#include #include struct Node {

double value; // 矩阵非零元素值int index;

// 元素地索引(序号或列标)

};

struct Matrix

{

struct Node *data; // 记录元素数据

int total_elem; // 矩阵非零元素个数

int total_ln; // 矩阵地总行数

int total_col; // 矩阵地总列数

};

// 采用MSR法实现系数矩阵地存储

void Create_Matrix( struct Matrix &matrix )

{

int index = 0, i = 0;

double value = 0.0;

printf( "请输入线性方程组系数矩阵地非零元素个数及总行数、总列数: " );

scanf( "%d%d%d", &matrix.total_elem, &matrix.total_ln, &matrix.total_col );DXDiTa9E3d

matrix.data = (struct Node *)malloc( sizeof(struct Node)*(matrix.total_elem+1) );RTCrpUDGiT

printf( "请依次输入矩阵地主对角线元素及每行地非零非对角线元素(行优先)\n" );

for( i = 0; i <= matrix.total_elem; i++ )

{

if( i == matrix.total_ln )

value = 0;

else

scanf( "%lf", &value );

matrix.data[i].value = value;

}

printf( "\n系数矩阵地信息相关如下(Quote为添加项,表示序列号):" );

printf( "\nValue:" );

for( i = 0; i < matrix.total_elem + 1; i++ )

printf( "%3.0lf", matrix.data[i].value );

printf( "\nQuote:" );

for( i = 0; i < matrix.total_elem + 1; i++ )

printf( "%3d", i );

printf( "\n\n" );

for( i = 0; i <= matrix.total_elem; i++ )

{

if( i == 0 )

相关文档
最新文档