记半途而废的解方程组程序开发-1

Posted tobe-goodlearner

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记半途而废的解方程组程序开发-1相关的知识,希望对你有一定的参考价值。

记半途而废的解方程组程序开发-1

简要

我曾试图开发一个可以解方程组的程序。付出不少努力后,最后放弃。
期间遇到了很多问题,在分享故事的同时,希望能给大家提个醒。??

如果您也在学习编程,不妨也简单实现一部分功能,摸清规律就不难,但对理解递归、 面向对象等概念有很大帮助。

本文是第一篇,我来讲述我实现“根号类”的过程。

背景、原因

高二时学圆锥曲线(就是椭圆、双曲线、抛物线那个),计算量特别大,做一道得算半天。

我当时正在啃 《流畅的python》 ,自以为技术不错,正好隔壁班一个练编程的同学找我讨论相关技术细节(如何因式分解),

我问他是不是想开发一个解方程组的程序,他说是——正好我也想。

于是和他一拍即合,一起开发。

当然我们都不是不知道有用于计算的程序以及模块,只是因此为契机,给自己找个练习的项目。

可能“ 初生牛犊不怕虎 ”说的就是我们这样的事。

发展

我们先花了一中午时间,讨论让程序解方程需要开发哪些功能,再给这些待完成的功能排了开发顺序。

当时是这么想的:

计算机算无法直接解方程,是因为它会直接把数计算出来
所以首先是要开发可以保留计算“半成品的”的类。
例如“根号”“待定系数”。


然后将总目标拆分成一个个小目标。
方程组由 方程 组成,方程由常数和 待定系数 组成,
常数中 分数根号 是内置类型中没有的,也需要完成。

其实python默认模块里有分数类,只是当时我不知道。


要先开发底层模块,也就是作未知数系数、方程常数的“ 根号 ”。
下一个应该是作为方程组成之一的“ 待定系数 ”,也就是x、y这样的数。
之后开发“ 分数 ”,避免把1 / 3算成0.333,同时它也支持分子、分母为根号和待定系数。

当时用的草稿纸,我还留着呢,哈哈哈。如图:
技术图片

在我的计划里,开发顺序从下往上,从左到右;上级类兼容下级类,而下级类不必考虑上级。

如图:

技术图片

有更多编程经验的诸位,可以看出我这个设计的巨大问题——模块间过于相互依赖
这使得我在开发时反复修改下级模块,debug费时费力。为最后放弃埋下祸根。

我在和数学老师(他是计算机系毕业的)闲聊时,把写程序的事告诉了他。
他“呵呵”笑了两声,没说什么。

正式开发

第一步是根号类。我把这个类的变量分为四个:“系数”“根底数”“附加项”(一个根号类列表 )和“常数”。

大至如此:

          ______     ______
系数 × ( √根底数1 + √根底数2 + ...) + 附加项 + 常数

我也打算像这样这样分两行显示,显示得很清楚吧。??

实例化根号类的第一步是处理提供的值 ,也就是“合并同类项”和“开根”。

  • 这个是第一个难关。

合并的同类项如下所示:

  1. 常数项
    来自直接提供和附加的根号类的常数项。
    处理办法是直接相加
  2. 相同的根底数
    来自直接提供和附加的根号类的根底数项。
    处理办法是把相同根底数的系数相加,再归入系数与新系数相同的根底数列表中,没有就添加一个附加项

开根如下所示:

把根号4等“整数”按整数处理

我使用的开根的方法是:
先用穷举法分解质因数,再用collection.Counter统计结果,
之后用“根次”整除以每个数量,得数乘出去,余数保留。

这里插一句,我那个同学,他实现时用的说穷举法……让我嘲笑了一通。

  • 下一个难题,是显示

python中没有直接操作多行文本的方法(如果你知道,请留言告诉我),
而我打算分两行显示文本,于是两行文本的协调就出现了问题。??

起初我想同时生成两行文本,但因为种种原因,最后总出错,比如多几个少几个空格。
当时我忙了至少两天,来解决问题……[捂脸]

这是我在纸上写的代码。这样的纸我写了好几张。

技术图片

最后我是先生成第2行的内容,再迭代生成第一行(毕竟信息几乎都在第二行)。

再插一句,我那个同学,他实现时只用了一行显示,类似“√2”。

还有我得到的一些经验:

可以创建一个“中间方法”(或者叫接口),返回“半成品”结果,用于迭代时调用。
这样可以避免方法过长,方便实现和后期阅读。(我记得这时“设计模式”的一种)

  • 接下来实现运算功能

第一步是求和
因为已经有处理提供的值的方法,只要把加数和类本身“打包”,交给生成新类就可以了。

第二步是取负,第三步是做差,都很简单。

最后是乘法
根号数之间相乘,需要每个元素两两相乘,有些麻烦。

  • 本文就写到这里,

如果您对有什么建议,欢迎回复。想看代码或效果,也请告诉我,我会尽快回复的。

谢谢!






















以上是关于记半途而废的解方程组程序开发-1的主要内容,如果未能解决你的问题,请参考以下文章

用python求一元二次方程的解

运用函数求方程式的解

用C语言编写程序实现一元二次方程的解?

求指教:Python怎样分别输出方程组的解?

线性共轭梯度法求解正定二次函数极小点以及线性方程组的解--MATLAB源程序

线性共轭梯度法求解正定二次函数极小点以及线性方程组的解--MATLAB源程序