让解一元二次方程更容易,美国奥数国家队教练建议用新方法,还能帮助简化代码
晓查 发自 凹非寺
量子位 报道 | 公众号 QbitAI
你是否还记得上面的公式是什么?没错,它就是一元二次方程的求解公式。
相信很多人在初中学习它的时候都很痛苦,因为这个公式实在有点难记。即使你到今天能够记得,还能回忆起当初的推导过程吗?
这个公式可能真的不太适合初学者。来自CMU数学系的副教授,同时也是美国奥数国家队教练的罗博深也注意到了这一点,他在博客中提出了一种更容易学会的求解方法。
罗博深一直致力于中学生的数学教育,在他的指导下,美国分别获得了国际奥林匹克数学竞赛(IMO)2015、2016、2018和2019年的冠军。
下面让我们来看看他是如何求解的。
求解更容易
一元二次方程的一般形式为ax2+bx+c=0,为了简化起见,不妨令a=1。(即使不等于1,也可以两边同时除以a)
x2+Bx+C=0
假设这个方式的两个解(或者叫根)分别是R和S,那么
x2+Bx+C = (x-R)(x-S) = 0
将右边的式子展开:
x2+Bx+C = x2-(R+S)x+RS
两边的对应系数应该相等:
B=-(R+S); C=RS
所以R和S的和应该等于-B,它俩的平均数就是-B/2,我们可以令这两数等于-B/2±z,而R和S的乘积又等于C,所以(-B/2+z)(-B/2-z)=C,即:
在上一步里,我们用到了平方差公式。上面的方程很容易求z:
所以方程的解是:
这个公式不需要记,罗博深教授希望你记下来的是求解过程。我们先来举个例子:
x2-2x-24=0
根据上面的求解过程,我们可以知道这两个解之和为2,因此我们可以假设它们分别是1+z和1-z,他们的乘积是-24:
(1+z)(1-z)=1-z2=-24
所以
z2=25 → z=±5
因此方程的两个解分别是1+5=6和1-5=-4。这种方法还适用于根是虚数的情况。
从古人那里获得启发
为何会想到这种求解方法,罗博深教授在博客里说,他是参考了一千多年以前古代的巴比伦人和希腊人的解法。
其中就包括3世纪的著名希腊数学家丢番图和7世纪的印度数学家婆罗摩笈多等等。
这些古人求解的其实是一个二元二次方程组:x+y=A,xy=B。这个方程组等价于x2-Ax+B=0。
罗博深指出,古代人知道方程组如何求解,却在很长一段时间都不知道一元二次方程解的标准形式。因此教科书里的方法显然更不易被理解。
让代码更具可读性
罗博深教授提出的是一个并不深奥的推导方法,却在Hacker News论坛上引起了广泛讨论。
有位网友表示,原来的公式很好记,用完全平方公式的配方法也能很容易求解。
而另一位来自社区大学的老师说,现在的学生数学基础并不好,很多人并不知道抛物线方程、完全平方公式、因式分解等概念,这种方法确实非常好。
除去一些批评,还是有网友认为,这种方式转移了对数学推导过程的思考,可以看做在人脑上运行代码。
而且这种方法用在编程里也让代码更具有可读性。
如果我们知道了一元二次方程两个解的算术平均数m和几何平均数g:
m = (r1 + r2) / 2;
g = sqrt(r1 * r2)
那么这两个解等于:
r1 = m - sqrt(m^2 - g^2)
r2 = m + sqrt(m^2 - g^2)
在罗博深教授的解法里,m=-B/2、g=sqrt(C)。这串代码显然比下面的代码更容易理解。
r1 = (-b - sqrt(b^2 - 4 * a * c)) / (2 * a)
r2 = (-b + sqrt(b^2 - 4 * a * c)) / (2 * a)
传送门
论文地址:
https://www.poshenloh.com/quadratic
网友讨论:
https://news.ycombinator.com/item?id=21720656
博客链接:
https://www.poshenloh.com/quadraticdetail
— 完 —
大咖齐聚!量子位MEET智能未来大会
量子位 MEET 2020 智能未来大会圆满结束!李开复、倪光南、景鲲、周伯文、吴明辉、曹旭东、叶杰平、唐文斌、王砚峰、黄刚、马原等AI大咖与你一起读懂人工智能。扫码观看回放吧~ ~
量子位 QbitAI · 头条号签约作者
վ'ᴗ' ի 追踪AI技术和产品新动态
喜欢就点「在看」吧 !
- 重新 java 对象的 equals 和 hashCode 方法的建议和示例代码
- [编写高质量代码:改善java程序的151个建议]建议34:构造函数尽量简化
- [编写高质量代码:改善java程序的151个建议]建议132 提升JAVA性能的基本方法
- 编写高质量OC代码52建议总结:13.用“方法调配技术”调试“黑盒方法”
- 牵扯较多属性和方法的类题目,很简单的题目本来不想发的,如果有同学学到这个题目感觉太长不愿敲代码,copy走我的即可~不过还是建议自己打一打
- 编写高质量代码改善C#程序的157个建议——建议2: 使用默认转型方法
- 编写高质量代码改善C#程序的157个建议——建议15: 使用dynamic来简化反射实现
- 超精简C#程序代码改进-利用扩展方法简化代码增强可读性
- 写高质量OC代码52建议总结:42.多用GCD,少用performSelector系列方法
- 编写高质量代码改善C#程序的157个建议——建议145:避免过长的方法和过长的类
- 编写高质量代码改善C#程序的157个建议[为泛型指定初始值、使用委托声明、使用Lambda替代方法和匿名方法]
- 编写高质量代码改善程序的157个建议:使用Dynamic来简化反射的实现
- 编写高质量代码改善C#程序的157个建议——建议150:使用匿名方法、Lambda表达式代替方法
- 编写高质量代码改善C#程序的157个建议[为泛型指定初始值、使用委托声明、使用Lambda替代方法和匿名方法]
- 编写高质量OC代码52建议总结:17.实现describtion方法
- 编写高质量代码改善C#程序的157个建议——建议48:Dispose方法应允许被多次调用
- 编写高质量代码改善C#程序的157个建议——建议90:不要为抽象类提供公开的构造方法
- 编写高质量代码改善C#程序的157个建议——建议93:构造方法应初始化主要属性和字段
- 编写高质量代码改善C#程序的157个建议——建议101:使用扩展方法,向现有类型“添加”方法
- [编写高质量代码:改善java程序的151个建议]建议66 asList方法产生的List对象不可更改