使用optimize.root求解迭代定义的方程

时间:2017-10-16 07:27:32

标签: python numpy scipy

我想迭代地解决以下问题(当然使用scipy / numpy):

(x_n+1)^2 = ((x_n)^2 + x_n+1) + 1
where x_0 = 1 and x_n > 0 for all n

找到第一个20次迭代(x_1, x_2,..., x_20)

更确切地说,在每次迭代中,我们都有X^2 - X - ((x_n)^2 + 1)形式的二次方程。我想继续为第一次10次迭代找到正根。例如,当我们得到n = 0时,

x_1^ - x_1 - 2 = 0

我们可以将其提供给scipy.optmize.root等解算器,以查找x_1。将解算器中的值用于下一次迭代等。我不知道如何开始编码这种问题。有什么帮助吗?

一点数学:上述一般二次方的判别式是正的,所以我们确实有真正的解。

1 个答案:

答案 0 :(得分:3)

没有必要为此使用通用的根查找器。只需重新排列等式并使用二次公式,将前一个x视为常数。

(x_n+1)^2 = ((x_n)^2 + x_n+1) + 1

重新排列,

(x_n+1)^2 - x_n+1 -((x_n)^2 + 1) = 0

所以我们现在以ax^2 + bx + c的形式得到等式,其中

a = 1
b = -1
c = -((x_n)^2 + 1))

因为我们只想要积极的根源,

x_n+1 = (1 + sqrt(1 + 4((x_n)^2 + 1))) / 2

简化,

x_n+1 = (1 + sqrt(5 + 4(x_n)^2)) / 2

将其翻译成Python:

from math import sqrt

x = 1
for i in range(11):
    print(i, x)
    x = (1 + sqrt(5 + 4 * x * x))/2

<强>输出

0 1
1 2.0
2 2.79128784747792
3 3.5068734338973964
4 4.1807826995593365
5 4.827694996292443
6 5.455465566142811
7 6.068851276822707
8 6.670976893506619
9 7.264017498033193
10 7.849554422666208