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:暂不给出。