【问题标题】:solve an iteratively defined equation using optimize.root使用 optimize.root 求解迭代定义的方程
【发布时间】:2017-10-16 07:27:31
【问题描述】:

我想迭代解决以下问题(当然使用 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。将求解器中的该值用于下一次迭代等。我什至不知道如何开始编写此类问题的代码。有什么帮助吗?

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

【问题讨论】:

  • 当您可以应用二次公式时,我认为没有任何理由使用像 scipy.optimize.root 这样的通用根查找器。
  • 实际上我要解决的问题更复杂,在这种情况下,不可能有一个明确的解决方案公式。在尝试完整解决方案之前,我想使用这个玩具箱。我将添加更多详细信息...

标签: python numpy scipy


【解决方案1】:

没有必要为此使用通用的根查找器。只需重新排列方程并使用二次公式,将前面的 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

【讨论】:

  • 我正在尝试解决一个更一般的非线性问题(仍然是二次问题),但具有 x_n+1 * x_n 等形式的项。在这种情况下,不可能有一个明确的解决方案公式.具体问题太复杂且特定于领域,我无法在这里询问。所以我问了这个玩具问题来了解我应该做什么。 :(
  • @minibuffer 您应该在问题中明确说明这一点。但即使在您的复杂系统中,您仍然可以使用将之前的 x 视为常量的原则。
  • 是的,我应该这样做。我会在早上添加更多细节。
猜你喜欢
  • 1970-01-01
  • 2017-06-22
  • 1970-01-01
  • 2015-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多