2、用列主元高斯消去法解线性方程组.
⑴ =
⑵ =
分别输出,解向量,(1)中A的条件数。分析比较(1)(2)的计算结果。
程序1(列主元高斯消去解线性方程组):
#include<stdio.h>
#include<math.h>
#define n 3
void LZYGSXQ(double a[n][n],double b[n]){
double x[3],L,max,det=1;
int r,t,i,j,k;
for(k=0;k<n-1;k++) //选组员
{
{
max=fabs(a[k][k]);
r=k;
}
for(i=k+1;i<n;i++)
{
if(fabs(a[i][k])>max)
r=i;
for(t=k;t<n;t++)
{
L=a[k][t];
a[k][t]=a[r][t];
a[r][t]=L;
}
L=b[k];
b[k]=b[r];
b[r]=L;
det=-det;
}
for(i=k+1;i<n;i++) //高斯消去
{
L=a[i][k]/a[k][k];
for(j=k;j<n;j++){
a[i][j]=a[i][j]-L*a[k][j];
}
b[i]=b[i]-L*b[k];
}
det=a[k][k]*det;
}
det=a[k][k]*det;
printf("高斯消去后的方程系数\n"); //输出高斯消去后的系数矩阵
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%f ",a[i][j]);
}
printf("%f ",b[i]);
printf("\n");
}
printf("\n");
printf("行列式的值det=%f\n",det);
x[n-1]=b[n-1]/a[n-1][n-1];
for(i=n-2;i>=0;i--){ //回代求解x
for(j=i+1;j<n;j++)
b[i]=b[i]-a[i][j]*x[j];
x[i]=b[i]/a[i][i];
}
printf("方程的解向量=(");
for(i=0;i<=n-1;i++)
printf("%f ",x[i]);
printf(")\n");
}
void main(){
double a1[3][3]={{3.01,6.03,1.99},{1.27,4.16,-1.23},{0.987,-4.81,9.34}},b1[3]={1,1,1};
double a2[3][3]={{3.00,6.03,1.99},{1.27,4.16,-1.23},{0.987,-4.81,9.34}},b2[3]={1,1,1};
LZYGSXQ(a1,b1);
printf("\n\n\n");
LZYGSXQ(a2,b2);
}
计算结果:方程组(1)的解向量为,方程组(2)的解向量为。
观察两方程组的系数矩阵可知:方程组(2)是由方程组(1)的系数矩阵发生微小变化得到。但此微小变化却引发线性方程组的解的巨大变化,所以方程组(1)为“病态”方程组,对应的系数矩阵为“病态”矩阵。
程序2(求矩阵的条件数):
#include "stdio.h"
#include "math.h"
#define n 3
#define m 6
void main()
{
double a[n][m]={{3.01,6.03,1.99,1,0,0},{1.27,4.16,-1.23,0,1,0},{0.987,-4.81,9.34,0,0,1}},L,t=0,b,limfanshu1,limfanshu2,tiaojianshu;
int i,j,k;
for(i=0;i<n;i++){ //求系数矩阵的无穷范数
b=0.0;
for(j=0;j<n;j++)
b=b+fabs(a[i][j]);
if(b>t)
t=b;
}
limfanshu1=t;
for(k=0;k<n-1;k++) //初等行变换求系数矩阵的逆矩阵
{
for(i=k+1;i<n;i++)
{
L=a[i][k]/a[k][k];
for(j=k;j<m;j++)
a[i][j]=a[i][j]-L*a[k][j];
}
}
for(i=0;i<n;i++)
{
L=a[i][i];
for(j=i;j<m;j++)
a[i][j]=a[i][j]/L;
}
for(k=n-1;k>0;k--)
{
for(i=0;i<k;i++)
{
L=a[i][k];
for(j=k;j<m;j++){
a[i][j]=a[i][j]-L*a[k][j];
}
}
}
printf("方程系数矩阵的逆矩阵为\n\n");
for(i=0;i<n;i++)
{
for(j=3;j<m;j++)
{
printf("%f ",a[i][j]);
}
printf("\n");
}
printf("\n\n");
t=0; //求逆矩阵的无穷范数
for(i=0;i<n;i++){
b=0.0;
for(j=3;j<m;j++)
b=b+fabs(a[i][j]);
if(b>t)
t=b;
}
limfanshu2=t;
tiaojianshu=limfanshu1*limfanshu2;
printf("条件数=%f\n",tiaojianshu);
}
由计算所得的系数矩阵的无穷条件数。所以方程组(1)为“病态”方程组,对应的系数矩阵为“病态”矩阵。与计算方程的解时得到的结论相同。
数值分析实验报告
掌握高斯消去法的基本思路和迭代步骤;
培养编程与上机调试能力。
设有方程组,设是可逆矩阵。高斯消去法的基本思想就是将矩阵的初等行变换作用于方程组的增广矩阵,将其中的变换成一个上三角矩阵,然后求解这个三角形方程组。
将方程组用增广矩阵表示。
对
(1) 选主元,找使得
(2) 如果,则矩阵奇异,程序结束;否则执行(3)。
(3) 如果,则交换第行与第行对应元素位置,,。
(4) 消元,对,计算对,计算
(1) 若则矩阵奇异,程序结束;否则执行(2)。
(2)
对,计算
解方程组
1:在Mathematica中,编写消元所需的代码
2:在Mathematica中,编写回代所需代码
3:利用Mathematica 进行运算
A={{0.101,2.304,3.555,1.183},{-1.347,3.712,4.623,2.137},{-2.835,1.072,5.643,3.035}};
n=Length[A[[All,1]]];
eps=10^(-5);
ext=0;
For[k=1,k<n,k++,i0=k;
For[i=k+1,i£n,i++,If[Abs[A[[i,k]]]>Abs[A[[i0,k]]],i0=i]];
If[Abs[A[[i0,k]]]<eps,ext=1;Break];
If[i0¹k,For[j=k,j£n+1,j++,t=A[[k,j]];
A[[k,j]]=A[[i0,j]];
A[[i0,j]]=t]];
For[i=k+1,i£n,i++,A[[i,k]]=A[[i,k]]/A[[k,k]];
For[j=k+1,j£n+1,j++,A[[i,j]]=A[[i,j]]-A[[i,k]]*A[[k,j]]]];
Print[MatrixForm[A]];]
If[Abs[A[[n,n]]]£eps,ext=1,A[[n,n+1]]=A[[n,n+1]]/A[[n,n]];
For[k=n-1,k³1,k--,w=0;
For[j=k+1,j£n,j++,w=w+A[[k,j]]*A[[j,n+1]]];
A[[k,n+1]]=A[[k,n+1]]-w;
A[[k,n+1]]=A[[k,n+1]]/A[[k,k]]]]
If[ext?1,Print["无解"],MatrixForm[A[[All,n+1]]]]
对这次实验的体会:把自己编写的代码输入到Mathematica中,得到运行解出了方程组的解,让我加深了对高斯列主元素消去法的认识与了解,学到了更多的知识。
实验报告一题目非线性方程求解摘要非线性方程的解析解通常很难给出因此线性方程的数值解法就尤为重要本实验采用两种常见的求解方法二分法和…
数值分析实验报告册课程实验报告专业年级课程名称数值分析指导教师学生姓名学号实验日期实验地点实验成绩教务处制20xx年6月20日实验…
数值分析报告运用Matlab求解非线性方程的根学院专业班级姓名学号数值分析报告1目的掌握非线性方程求根的方法并选取实例运用MATL…
实验报告一题目非线性方程求解摘要非线性方程的解析解通常很难给出因此线性方程的数值解法就尤为重要本实验采用两种常见的求解方法二分法和…
实验报告一题目非线性方程求解摘要非线性方程的解析解通常很难给出因此线性方程的数值解法就尤为重要本实验采用两种常见的求解方法二分法和…
实验报告一题目非线性方程求解摘要非线性方程的解析解通常很难给出因此线性方程的数值解法就尤为重要本实验采用两种常见的求解方法二分法和…
插值与拟合1观察直接利用拉格朗日插值多项式的病态性实验目的如果直接利用拉格朗日插值多项式的的定义即yxia0a1xia2xianx…
机电工程学院机械工程陈星星6720xx0109数值分析课程设计实验报告实验一函数插值方法一问题提出对于给定的一元函数yfx的n1个…