Project 1: Equation Solver 方程求解器
引言
现实生活中,有很多实用的计算是通过程序来实现的。
一个金融领域的例子
(数学或者专业知识不够的话可以跳过):
你要将手中的元人民币用于投资,现在有多种投资方式可供选择。每种投资方式的收益是(更准确地说,设每种投资方式的收益是随机变量)。现在请问,怎样分配投资资金可以使得风险最小?
更专业一点,如何达成一个efficient frontier portfolio
?
表述成数学的形式,就是如下问题:
其中,是可以有不同选择的Utility Function
,代表求关于的数学期望。
这样的数学问题,很难通过纸和笔计算;通常,我们会设计一个计算机算法去求解。
从简单的算法开始
在这个项目里,我们需要使用 Python 几乎全部的基础语法,并且灵活运用函数,来实现一些简单的算法,解决一些数学问题。今后若是在 Lecture 上看到一个数学算法,你就可以很自豪地用程序实现它了。
准备工作
Section 1: 求解线性方程
我们知道,一个线性方程可以写作以下一般形式:
请完成 Question 1
,函数的参数是和的值,输出对应方程的解,放在一个列表([]
)内。如果方程无解,请返回[]
。如果方程有无数个解,请返回 None
。
提示:注意 的情况。
Section 2: 公式法求解方程
一个一元二次方程可以写作以下一般形式:
请完成 Question 2
,函数的参数是 , 和 的值,将所有解放在一个列表([]
)内。如果方程无解,请返回[]
。如果方程有无数个解,请返回 None
。
提示:可以使用一元二次方程求根公式进行求解。
Section 3: 牛顿迭代法求解方程
现在,我们来介绍一种通过程序才能实现的求解方程的方法——牛顿迭代法。它对所求解的方程的形式并没有什么特定要求,其思想在数学优化问题中非常常用。
我们定义了 solve_equation
这个函数,它的唯一一个参数 f
,就是用户定义的任意函数。
请编写程序进行求解,并且返回 f(x) = 0
的任意一个解。
提示1:求导过程可以令 来近似地获得一个函数在某一点的切线斜率。
提示2:暂不给出。