c语言 计算器_如何利用C语言自己动手写一个行列式计算器?

dca67287f303b051757c838963b9984e.png
难度系数:★★★☆☆
设想:利用 二维数组存放矩阵,利用 递归法将行列式展开然后降阶运算。

一、知识预备

利用

展开定理可以将行列式
按任意行任意列展开. 这里我们采用按第一列展开,得

二、基本思路

由于3阶以下的行列式计算可以直接使用对角线法则,因此对于高阶行列式,考虑从降阶的角度入手. 降阶的具体方法是将行列式按第一列展开,并将代数余子式再按其第一列展开,依此类推,直至行列式被降阶至3阶及3阶以下;

是可以定义一个用来执行

展开定理
的函数用于专门按第一列展开行列式,然后使用 递归的方法对行列式逐层降阶,本文中,我们统一降阶到1阶来计算.

三、实现方法

1. 定义主函数,分别来实现:输入行列式的阶(order),判断阶是否合法;如果阶合法,再输入一个order阶行列式本身,这里采用二维数组来储存矩阵(matrix);利用另定义的行列式计算函数(determinant),将矩阵和阶传入 determinant 函数,计算行列式的值;最后输出结果.

int 

2. 接着来编写 determinant 函数. 如果行列式为1阶,行列式的值便是

的值,即 matrix[0][0]; 如果行列式的阶高于1,我们采用另定义的
展开函数 laplace_expansion 来降阶,并在函数中直接展开后余子式的值. 将
展开函数定义为
int 

其中

分别执行展开时选定元素在行列式中的行数和列数,统一选定
,即选取第一列元素.

展开的结果是一个余子式

,用cofactor表示,由于公式中是
代数余子式
,因此定义 sign = 1 用来记录该行该列代数余子式的符号,每换一行乘上 -1,于是展开式每一项的值便是
sign 

于是有:

int 

3. 编写 laplace_expansion 函数计算余子式的值:

在 determinant 函数中,我们向 laplace_expansion 函数传递了选定的行

和列
;在余子式的定义中,
元素
的余子式是划掉行列式第
行第
列,并把留下原来的元素按原来的相对位置关系排列得到的行列式
. 可以这样构思来取余子式:选定了元素
后,对于行数
小于
,列数
小于
的位置,余子式cofactor[i][j] = matrix[i][j];对于行数
大于
而列数
小于
的位置,将原行列式的行数减去 1 对应到余子式上;对于行数
小于
而列数
大于
的位置,将原行列式的列数减去 1 对应到余子式上;而对于行数
大于
且列数
大于
的位置,则需要将原行列式的行数和列数均减去 1 对应到余子式上. 根据上述思路写出以下代码:
for

这样一来,二维数组cofactor中储存了余子式对应的矩阵,这时候把cofactor和降阶后的阶数order - 1 传回 determinant 函数,利用

determinant

计算余子式的值,而如果余子式依然高于1阶,determinant 函数又回让余子式重新执行laplace_expansion 函数继续降阶,直至被降至1阶. 如此操作,便在两个函数之间实现了递归,行列式被一层层“剥开”并被逐步计算出来. 整个过程的代码为:

int 

这时候,整个程序已经能实现行列式计算了,最后加上一些基本的说明以便用户操作即可. 以下是本程序的全部代码:

#include 

附上.c文件:

行列式计算器.c
2K
·
百度网盘

四、一些说明

• 这个行列式计算器理论上可以计算

阶,只是阶数过高运行速度会变慢,把
matrix

中的20修改为更大数值即可提高计算上限;

• 展开时不一定要选定第一列,只要修改 deteminant 函数中的

cofactor 

这一行的 0 修改为其他数值便能改为其他列,或者修改

for

循环中的

把按列展开改为按行展开.

最后,让行列式计算器解一个书本例题:

10012280a390da9d498e12d740e8399b.png
陈维新《线性代数》1.4节的一道6阶行列式计算题

上述方法并不是最简单的,只是展现本人对递归计算行列式的一些思路,仅供参考。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值