【问题标题】:Why does fsolve give the initial condition as the solution?为什么 fsolve 给出初始条件作为解?
【发布时间】:2021-05-06 15:28:21
【问题描述】:
from scipy.optimize import fsolve

def f_sum(beta, gamma, x):
    f = (
        3 * x ** (3 * (1 - gamma)) / (np.exp(1 / beta) - x ** (1 - gamma))
        + x ** (4 * (1 - gamma)) / (np.exp(1 / beta) - x ** (1 - gamma)) ** 2
        - 3 * x ** (3) / (np.exp(1 / beta) - x ** (1))
        - x ** (4 * (1)) / (np.exp(1 / beta) - x ** (1)) ** 2
    )
    return f


def equilibrium(p, beta, gamma, x):
    if x > 1:
        return 1000
    elif x < -1:
        return -1000
    else:
        g = (
            x * (1 - x ** 2) * (1 - p) / 2
            + f_sum(beta, gamma, (x + 1) / 2)
            - f_sum(beta, gamma, (1 - x) / 2)
        )
    return g


print(fsolve(lambda x: equilibrium(1.0, 0.1, 0.3775, x), 0.6))

我正在使用 fsolve 来查找严格介于 -1 和 1 之间的函数的根。x 介于 -1 和 1 之间。而 gamma 介于 0 和 0.5 之间。 Beta 为正。

我知道该函数有3个根-1、0和1。我只是尝试看看是否还有更多用于特定参数组合的参数。

但是,对于具体参数,解与初始条件相同。我试图绘制函数并且没有这样的固定点,所以这显然是错误的。

我还收到以下错误:“RuntimeWarning:迭代没有取得良好进展,由 过去十次迭代的改进。 warnings.warn(msg, RuntimeWarning)"

有什么问题?我还尝试更改所选参数的初始条件(在打印函数中),但高于 initial=0.6 时,它一直给出初始值。

【问题讨论】:

  • 嗨。你需要深入研究你的功能。 x=e**(1/beta*(1-gamma))x=e**(1/beta) 有两个奇点。您需要检查功能域,它是否总是为x&lt;0 定义的?我猜你所说的“定点”是函数根f(x)=0。您可以简单地验证对于 beta=gamma=1 对于 x=0 你得到 y!=0 所以 0 并不总是一个根。
  • 嗨,它们不是奇点,因为 x 介于 -1 和 1 之间。我应该指定 gamma 介于 0 和 0.5 之间,抱歉,感谢您的说明,我将对其进行编辑。
  • 嗯,好的。这是你的功能吗? geogebra.org/calculator/kbdnv97h
  • 是的。但我关心小 p 让我们现在说 p

标签: python optimization scipy


【解决方案1】:

鉴于equilibrium 函数的复杂性及其有限域x∈[-1,1],例如,最好使用least_squares

import numpy as np
from scipy.optimize import least_squares

def f_sum(x, beta, gamma):
    f = (
        3 * x ** (3 * (1 - gamma)) / (np.exp(1 / beta) - x ** (1 - gamma))
        + x ** (4 * (1 - gamma)) / (np.exp(1 / beta) - x ** (1 - gamma)) ** 2
        - 3 * x ** (3) / (np.exp(1 / beta) - x ** (1))
        - x ** (4 * (1)) / (np.exp(1 / beta) - x ** (1)) ** 2
    )
    return f


def equilibrium(x, p, beta, gamma):
    g = (
        x * (1 - x ** 2) * (1 - p) / 2
        + f_sum((x + 1) / 2, beta, gamma)
        - f_sum((1 - x) / 2, beta, gamma)
    )
    return g

现在我们可以在定义的域中找到根 (bounds)

roots = least_squares(
    equilibrium, 
    x0=(-1, -.5, 0, .5, 1), 
    args=(2.5, 4.4, 0.06), 
    bounds=(-1, 1)
)

给了

print(roots)

 active_mask: array([-1,  0,  0,  0,  1])
        cost: 4.1713539926658053e-22
         fun: array([-1.99740779e-11, -4.23644453e-12,  0.00000000e+00,  4.28902747e-12,
        1.99740779e-11])
        grad: array([ 1.27723833e-10, -1.00057191e-12,  0.00000000e+00,  1.01299110e-12,
       -1.27723833e-10])
         jac: array([[-6.39447955, -0.        ,  0.        ,  0.        , -0.        ],
       [ 0.        ,  0.23618199,  0.        ,  0.        , -0.        ],
       [ 0.        , -0.        , -0.12019887,  0.        , -0.        ],
       [ 0.        , -0.        ,  0.        ,  0.236182  , -0.        ],
       [ 0.        , -0.        ,  0.        ,  0.        , -6.39447955]])
     message: '`gtol` termination condition is satisfied.'
        nfev: 6
        njev: 6
  optimality: 1.358478265237574e-12
      status: 1
     success: True
           x: array([-1.        , -0.34105647,  0.        ,  0.34105647,  1.        ])

根在哪里

print(roots.x)

[-1.         -0.34105647  0.          0.34105647  1.        ]

我们可以验证

import matplotlib.pyplot as plt

x = np.linspace(-1, 1, 1000)
y = equilibrium(x, 2.5, 4.4, 0.06)

plt.plot(x, y)
plt.axhline(0, color='r', lw=1)
plt.vlines(roots.x, *plt.ylim(), color='k', ls='--')

固定根

即使您的函数equilibrium 非常复杂,也相对容易证明(无需任何计算和/或估计)在域 x∈[-1,1] 中存在三个根 x={-1, 0,1} 独立于 beta 和 gamma。

其实我们可以写出对相似词进行分组的函数

这里,对于 p≠1,f(x)=0 的必要条件是 A=0,它简单地导致

所以我们现在可以很容易地证明这些条件是唯一的根 f(x)=0 并且独立于 beta 和 gamma

所以,三个固定根是 x={-1,0,1},其中 f(x)=0 ∀β,γ

【讨论】:

  • 但如果A=0,则p!=1,f(x)=0不是必要条件。作为 geogebra 模拟中的反例 β=0.35, γ=0.14, n=4.5 有 5 个根
  • 你说你想要 p
  • 是的,但即使对于 p和 γ 的一些条件,如果 A=0,我无法证明 f(x)=0。我不认为这是我使用 fsolve 扫描所有组合的原因。但是 fsolve 不起作用。任何想法为什么?
  • 你是对的。我在考虑独立于 beta 和 gamma 的根(“固定根”),但还有其他两个可能的根依赖于 gamma 和 beta。我会处理它和fsolve。如果我发现问题,我会通知您,
  • 完美,谢谢,我不知道最小二乘,它有效!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 2018-02-19
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多