数学建模由鸡兔同笼问题抽象出的一类线性方程组的解法并用代码进行实现

更新时间:2023-05-11 19:53:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

由鸡兔同笼问题抽象出的一类线性方程组的解法并用代码进行

实现

摘要:

线性方程组的解法,早在中国古代的数学著作《九章算术 方程》章中已作了比较完整的论述。其中所述方法实质上相当于现代的对方程组的增广矩阵施行初等行变换从而消去未知量的方法,即高斯消元法。在西方,线性方程组的研究是在 17 世纪后期由莱布尼茨开创的。他曾研究含两个未知量的三个线性方程组组成的方程组。麦克劳林在 18 世纪上半叶研究了具有二、三、四个未知量的线性方程组,得到了现在称为克莱姆法则的结果。克莱姆不久也发表了这个法则。 18世纪下半叶,法国数学家贝祖对线性方程组理论进行了一系列研究,证明了n元齐次线性方程组有非零解的条件是系数行列式等于零。

大量的科学技术问题,最终往往归结为解线性方程组。因此线性方程组的数值解法在计算数学中占有重要地位。本文将对一般线性方程组的解法进行探究。

关键字:线性方程组、高斯消元、矩阵

相关知识: 高斯消元法:

基本思想:用逐次消去未知数的方法把原方程组化为上三角形方程组进行

求解。

求解分为两步:

1、 消元过程:用初等行变换把原方程组的系数矩阵化为上三角形矩阵。 2、 回代过程:对上三角方程组的最后一个方程求解,将求得的解逐步往上

一个方程代入求解。

一、问题的提出

大约在1500年前,我国古代数学名著《孙子算经》中记载了一个有趣的问题。书中是这样叙述的:“今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?” 这四句话的意思是:有若干只鸡兔同在一个笼子里,从上面数,有35个头;从下面数,有94只脚。问笼中各有几只鸡和兔?

古人在《孙子算经》中是这样解决这个问题的:假设让鸡抬起一只脚,兔抬起两只脚,还有94÷2=47只脚;这时每只鸡一只脚,每只兔两只脚,笼子里只要有一只兔,则脚的总数就比头的总数多1;这时脚的总数与头的总数之差47-35=12,就是兔的只数。

这个问题虽然很容易就得到了解决,但是在继续进行“龟鹤同游”和“人狗同行”问题的研究时,我们发现 “鸡兔同笼”不只是代表着鸡、兔同笼的问题,

有很多类似的问题都可以看成是“鸡兔同笼”问题,如牛鸡问题、汽车和自行车的轮子问题等等。

所以,我们对这类问题进行抽象,以找出这一类问题的解法。

二、问题分析

对于“鸡兔同笼”问题不用方程的思想可以这样认为:

假设全是鸡:2×35=70(只), 比总脚数少的:94-70=24 (只) 兔:24÷(4-2)=12 (只) 鸡:35-12=23(只)

将“鸡兔同笼”问题中的“鸡”和“兔”分别抽象为“x”和“y”,于是上述问题转化为求解二元一次方程组:

针对“鸡兔同笼”的实际问题,其中假设的“x”和“y”都必须是非负整数,实际生活中的问题的解并不都是这样整齐的,于是我们继续将这个问题一般化,这一类的所有问题都可以归结为解方程组:

即Ax=b

其中,A=错误!未找到引用源。,b= 错误!未找到引用源。错误!未找到引用源。

对比看:这样,就将与“鸡兔同笼”同类问题抽象为求二元一次方程组的解的问题。利用以前所学习过的知识,上述问题很容易求得答案。于是这一类问题很容易的得到解决。

而在实际生活中,只存在两个变量的问题是很少的,例如下面的问题:

营养减肥食谱

剑桥减肥食谱——用33种食物精确提供31种营养现仅考虑三种食品三种营

同样将变量抽象为数学符号,设这三种食物的量分别为x1,x2,x3。 可列方程组:

其增广矩阵B为:

36511333 B 52347445

071.13

用高斯消元法对矩阵化简:

347445 52

B 027.46 38.231.85

0010.852.53 回代得解:x1=0.277,x2=0.392,x3=0.233.

为了提供所需要的蛋白质、碳水化合物和脂肪总量,食谱中需要包含0.277

单位的脱脂牛奶,0.392单位的大豆粉,0.233单位的乳清. 由上面问题可以看出,将问题抽象为数学符号并用二元一次方程组和三元一次方程组的方法求解会使问题更加清晰,把事物符号化也更容易向别人解释阐述。

三、问题的推广

在实现了三元一次方程组求解之后,我们希望找到更复杂问题的解,于是将方程推广为n元

其中的未知数。

如果用线性代数中的概念来表达,则线性方程组可以写成:

以及等等是已知的常数,而等等则是要求的

由于方程与未知数较多,计算较为复杂,为了更高效的求解,我们利用高斯消元法的思想用c语言编写程序,实现对n元线性方程组的求解。

四、程序代码

#include<math.h> #include<stdio.h> #define MAX 10

float a[MAX][MAX+1] ,ark; int r,n;

jiaohuan(int r,int k) {

float b; int i,j;

for(i=1;i<=n+1;i++) { }

for(i=1;i<=n;i++) {

for(j=1;j<=n+1;j++) b=a[r][i]; a[r][i]=a[k][i]; a[k][i]=b;

printf(" %fl",a[i][j]);

}

printf("\n");

}

printf("\n");

}

float maxr(int k) { int i; double zhu=0; for(i=k;i<=n;i++) { if(fabs(a[i][k])>zhu) { zhu=fabs(a[i][k]); r=i;

}

}

return zhu;

} main()

{ float x[MAX]; int k,i,j;

printf("\n高斯列主元消元法解线性方程组"); printf("\n 请输入方程组的维数:n="); scanf("%d",&n);

printf(" \n\n请输入系数矩阵a:\n"); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { printf("请输入a[%d][%d]=",i,j);

scanf("%f",&a[i][j]);

}

}

for(i=1;i<=n;i++)

{ printf("\n请输入b[%i]=",i);

scanf("%f",&a[i][n+1]);

}

for(k=1;k<=n-1;k++) { ark=maxr(k); if(ark==0)

{ printf("\n系数为零错误,即将退出!"); }

else if(r!=k)

jiaohuan(r,k);

for(i=k+1;i<=n;i++) { for(j=k+1;j<=n+1;j++) { a[i][j]=a[i][j]-a[k][j]*a[i][k]/a[k][k]; }

}

for(i=k+1;i<=n;i++) { a[i][k]=0; }

for(i=1;i<=n;i++) { for(j=1;j<=n+1;j++) { printf(" %fl",a[i][j]); }

printf("\n");

}

printf("\n");

}

x[n]=a[n][n+1]/a[n][n]; for( k=n-1;k>=1;k--) { float me=0; for(j=k+1;j<=n;j++)

{ me=me+a[k][j]*x[j];

}

x[k]=(a[k][n+1]-me)/a[k][k]; }

printf("\n回代求得:\n"); for(i=1;i<=n;i++)

{ printf(" \tx%d=%f",i,x[i]); }

printf("\n"); }

在VC++6.0上运行程序,试解一个四元一次方程组

得到结果如下:

-8-

五、优缺点及改进方法

用线性方程组可以清晰的表示现实事物,较准确的对多种事物进行分类。但是,线性方程组的解也有可能无解、可能有无穷个解,解的具体情况还需进一步讨论。同时,多元的线性方程组较难求解,用计算机可以快速计算出结果;需要进一步研究的是提高运算精度,减小误差。

六、参考文献

[1]黄明游等,《数值计算方法》.北京:科学出版社,2011。 [2]姜启源等,《数学模型》.第三版.北京:高等教育出版社,2003。 []

本文来源:https://www.bwwdw.com/article/djae.html

Top