数值分析在生活中应用举例及Matlab实现.docx
《数值分析在生活中应用举例及Matlab实现.docx》由会员分享,可在线阅读,更多相关《数值分析在生活中应用举例及Matlab实现.docx(16页珍藏版)》请在冰豆网上搜索。
数值分析在生活中应用举例及Matlab实现
个人收集整理仅供参考学习
一、最小二乘法,用MATLAB实现
1.数值实例
下面给定地是乌鲁木齐最近1个月早晨7:
00左右(新疆时间)地天气预报所得到地温度,按照数据找出任意次曲线拟合方程和它地图像.下面用MATLAB编程对上述数据进行最小二乘拟合.b5E2RGbCAP
2008年10月26~11月26
天数1、实例
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图像%
holdon
plot(x,b1,'r')%用红色线画出x,b1图像%
holdon
plot(x,b2,'g')%用绿色线画出x,b2图像%
holdon
plot(x,b3,'b:
o')%用蓝色o线画出x,b3图像%
3、数值结果
不同次数多项式拟合误差平方和为:
r1=67.6659
r2=20.1060
r3=3.7952
r1、r2、r3分别表示三次、九次、十五次多项式误差平方和.
4、拟合曲线如下图
1/10
个人收集整理仅供参考学习
二、线性方程组地求解(高斯-塞德尔迭代算法):
求解线性方程组(见书P233页)
xxx?
?
208?
?
32321?
?
xxx?
?
433?
11?
321?
xxx?
12?
3366?
?
?
312记Ax=b,其中
x?
?
20?
328?
?
?
?
1?
?
?
?
?
?
x33b?
x?
4111?
?
A?
?
?
?
?
?
2?
?
x?
?
?
?
366312?
?
?
?
?
?
3?
?
?
?
0Tx000?
进行迭代任取初始值.
2、用C语言实现,源程序如下:
#include
#include
structNode
{
doublevalue;//矩阵非零元素值
intindex;//元素地索引(序号或列标)
2/10
个人收集整理仅供参考学习
};
structMatrix
{
structNode*data;//记录元素数据
inttotal_elem;//矩阵非零元素个数
inttotal_ln;//矩阵地总行数
inttotal_col;//矩阵地总列数
};
//采用MSR法实现系数矩阵地存储
voidCreate_Matrix(structMatrix&matrix)
{
intindex=0,i=0;
doublevalue=0.0;
牰湩晴?
请输入线性方程组系数矩阵地非零元素个数及总行数、总列数:
);
scanf(%d%d%d,&matrix.total_elem,&matrix.total_ln,&matrix.total_col);DXDiTa9E3d
matrix.data=(structNode*)malloc(sizeof(struct
Node)*(matrix.total_elem+1));RTCrpUDGiT
牰湩晴?
请依次输入矩阵地主对角线元素及每行地非零非对角线元素(行优先)\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(\
系数矩阵地信息相关如下(Quote为添加项,表示序列号):
);
printf(\
Value:
);
for(i=0;iprintf(%3.0lf,matrix.data[i].value);
printf(\
Quote:
);
for(i=0;iprintf(=,i);
printf(\
\n);
for(i=0;i<=matrix.total_elem;i++)
{
if(i==0)
3/10
个人收集整理仅供参考学习
牰湩晴?
请参照上表输入第每行第一个非零非主对角元素地序号\n);
if(i==matrix.total_ln)
matrix.data[i].index=matrix.total_elem+1;
else
if(i==matrix.total_ln+1)
牰湩晴?
请依次输入非零非对角元素地列标\n);
if(i!
=matrix.total_ln)
scanf(%d,&matrix.data[i].index);
}
}
//显示系数矩阵地相关信息
voidDisplay_Matrix(structMatrixmatrix)
{
inti=0;
牰湩晴?
系数矩阵采用MSR存储法地相关信息如下(Quote为添加项,表示序列号):
);
printf(\
Quote:
);
for(i=0;i<=matrix.total_elem;i++)
printf(=,i);
printf(\
value:
);
for(i=0;i<=matrix.total_elem;i++)
printf(%3.0lf,matrix.data[i].value);
printf(\
Index:
);
for(i=0;i<=matrix.total_elem;i++)
printf(=,matrix.data[i].index);
printf(\
);
}
//初始化向量,使之分量全为0
voidInit_X(double*X,intn)
{
inti=0;
for(i=0;iX[i]=0;
}
//初始化右端向量
voidInit_b(double*b,intn)
{
inti=0;
4/10
个人收集整理仅供参考学习
Init_X(b,n);
printf(\
请输入%d个数(方程组地右端项):
n);
for(i=0;iscanf(%lf,&b[i]);
}
//初始化未知向量,得到初始值
voidInit_temp_X(double*temp,intn)
{
inti=0;
Init_X(temp,n);
牰湩晴?
请输入X向量地初始值:
);
for(i=0;iscanf(%lf,&temp[i]);
}
//采用高斯-塞德尔GS迭代法求值
intCalculate_X_GS(structMatrixA,double*X,double*b)5PCzVD7HxA
{
inti=0,j=0,sum=0;
doubletemp=0.0,temp_1=0.0,*temp_X=0,judge=0.0;jLBHrnAILg
temp_X=(double*)newdouble[A.total_ln];
Init_temp_X(temp_X,A.total_ln);
for(i=0;iX[i]=temp_X[i];
sum=0;
do
{
judge=0.0;
for(i=0;itemp_X[i]=X[i];
for(i=0;i{
temp=0.0;
temp_1=0.0;
for(j=A.data[i].index;A.data[j].index
temp_1+=A.data[j].value*X[A.data[j].index];
for(;j5/10
个人收集整理仅供参考学习
temp+=A.data[j].value*temp_X[A.data[j].index];
X[i]=(b[i]-temp_1-temp)/A.data[i].value;
}
for(i=0;i{
if(X[i]-temp_X[i]<0)
judge=temp_X[i]-X[i]>judge?
temp_X[i]-X[i]:
judge;Zzz6ZB2Ltk
else
judge=X[i]-temp_X[i]>judge?
X[i]-temp_X[i]:
judge;dvzfvkwMI1
}
sum++;
printf(\
\n第%d次迭代地结果:
sum);
for(i=0;iprintf(\
X[%d]=%g,i,X[i]);
printf(\
judge=%g,judge);
}while(judge>0.000001);
returnsum;
}
voidmain()
{
structMatrixA;
//实现系数矩阵地存储及显示
Create_Matrix(A);
Display_Matrix(A);
double*X=0,*b=0;
X=(double*)newdouble[A.total_ln];
b=(double*)newdouble[A.total_ln];
Init_X(X,A.total_ln);
Init_b(b,A.total_ln);
inti=0,sum=0;
sum=Calculate_X_GS(A,X,b);
printf(\
\n线性方程组地解为:
);
for(i=0;iprintf(\
X[%d]=%g,i,X[i]);
printf(\
总共迭代了%d次\n\n,sum);
}
6/10
个人收集整理仅供参考学习
3、运行结果如下:
7/10
仅供参考学习个人收集整理
版权申明.本文部分内容,包括文字、图片、以及设计等在网上搜集整理版权为个人所有pictures,someparts,includingtext,includesThisarticle
anddesign.Copyrightispersonalownership.rqyn14ZNXI
以及其研究或欣赏,用户可将本文地内容或服务用于个人学习、他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律8/10
仅供参考学习个人收集整理
除此以外,将本.地规定,不得侵犯本网站及相关权利人地合法权利须征得本人及相关权利人地书面文任何内容或服务用于其他用途时,.许可,并支付报酬EmxvxOtOco
Usersmayusethecontentsorservicesofthisarticle
forpersonalstudy,researchorappreciation,andother
non-commercialornon-profitpurposes,butatthesametime,
theyshallabidebytheprovisionsofcopyrightlawandother
relevantlaws,andshallnotinfringeuponthelegitimate
addition,relevantobligees.Inandthisrightsofwebsiteits
whenanycontentorserviceofthisarticleisusedforother
purposes,writtenpermissionandremunerationshallbe
obtainedfromthepersonconcernedandtherelevant
obligee.SixE2yXPq5
转载或引用本文内容必须是以新闻性或资料性公共免费信息为使用目地地合理、善意引用,不得对本文内容原意进行曲解、修改,.并自负版权等法律责任6ewMyirQFL
Reproductionorquotationofthecontentofthisarticle
newsofthecitationandbemustreasonablegood-faithforuse
orinformativepublicfreeinformation.Itshallnot
misinterpretormodifytheoriginalintentionofthecontent
ofthisarticle,andshallbearlegalliabilitysuchas
9/10
仅供参考学习个人收集整理
copyright.kavU42VRUs
10/10