scipy-fsolve在输入值较少时失败,如何提高解算器的收敛性

2024-05-21 04:06:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用科学优化求解两个方程的根。fsolve在某些范围的b值(0.1到0.6)下运行良好,但在0.9或0.99等值下运行失败。你知道吗

我尝试过移动到最小平方或最小化,但是在提供初始条件时得到一个元组错误。你知道吗

包括来自以下调查结果的编辑:

from scipy.optimize import fsolve
import scipy.stats as st
from numpy import *
import numpy as np



def rod(var1, var2, mu, sigma):
    return (st.lognorm.ppf(var1, s = sigma, scale = np.exp(mu), loc = sigma))/(st.lognorm.ppf(var2, s = sigma, scale = np.exp(mu), loc = sigma))
def fs_spfs(var1, mu, sigma):
    return (st.lognorm.ppf(var1, s = sigma, scale = np.exp(mu), loc = sigma))


a = 44.0
b = 0.5  #fsolve works for 0.5, 0.9, 0.99 but not for 0.95, incidentally works for 0.950001
c = 1.26

def f(x):
    y = np.zeros(2)
    y[0] = ((fs_spfs((1-b), x[0], x[1]) - a))
    y[1] = (((fs_spfs(0.9, x[0], x[1])/fs_spfs(0.1, x[0], x[1]))   - c))
    print(y)
    return y


x0 = np.array([1., 0.01])
solution = fsolve(f, x0)
print( "(x, y) = (" + str(solution[0]) + ", " + str(solution[1]) + ")")

b=0.5的结果

b = 0.5

(x, y) = (3.7821340072441982, 0.09035467410258388)

fs_spfs((1-b), solution[0], solution[1]) # expected answer = 44.
43.99999999999982

rod(0.9, 0.1, solution[0], solution[1]) # exptected answer = 1.26
1.2599999999999958

b=0.9的结果

b = 0.9

(x, y) = (3.8979025451494755, 0.09033430819655046)

fs_spfs((1-b), solution[0], solution[1]) # expected answer = 44.
43.999999999989164


rod(0.9, 0.1, solution[0], solution[1]) # exptected answer = 1.26
1.2600000000001814

对b=0.99也有效,但对b=0.95无效。顺便说一句,b=0.950001


Tags: answerimportreturndefnpfssigmast