当前位置: 首页 > 知识库问答 >
问题:

使用scipy fsolve(遇到数学域错误)求解非线性方程组

柯瀚海
2023-03-14

我试图用Scipy的fsolve找到两个非线性方程组的答案。这两个方程是:

f1 = math.log(x) + 1. - ((1. + (m - 1)*x) / m) + chi * (1 - x)**2
f2 = math.log(1 - x) - (m - 1)*x + chi*m*x**2

在这种情况下,mchi是常量。基本目标是找到同时满足f1(x)=f1(y)f2(x)=f2(y)xy。我知道xy的初始猜测是0.30.99。下面是我的代码。

from scipy.optimize import fsolve
import math

# some global variables
m = 46.663
chi = 1.1500799949128826

def binodal_fsolve():
    def equations(p):
        x, y = p
        out = []
        out.append(math.log(x) + 1. - ((1. + (m - 1)*x) / m) + chi * (1 - x)**2 - (math.log(y) + 1. - ((1. + (m - 1)*y) / m) + chi * (1 - y)**2))
        out.append(math.log(1 - x) - (m - 1)*x + chi*m*x**2 - (math.log(1 - y) - (m - 1)*y + chi*m*y**2))

        return out

    initial_guess = [0.3, 0.99]
    ans = fsolve(equations, initial_guess)

    return ans

def test_answers(phiL, phiR):
    def functions(x):
        return math.log(x) + 1. - ((1. + (m - 1)*x) / m) + chi * (1 - x)**2, math.log(1 - x) - (m - 1)*x + chi*m*x**2

    return functions(phiL)[0], functions(phiR)[0], functions(phiL)[1], functions(phiR)[1]

print (test_answers(0.2542983070, 0.9999999274))
# (1.3598772108380786e-09, -1.5558330624053502e-09, -8.434988430355375, -8.435122589529684)
res = binodal_fsolve()
print (res)

当我执行代码时,我总是遇到数学域错误。但是,如果我尝试使用MAPLEfsolve解决它。我可以得到答案(0.2542983070,0.999999 274)

通过将这些插入方程,我得到(1.3598772108380786e-09, -1.5558330624053502e-09, -8.434988430355375, -8.435122589529684),这表明答案是正确的。我不知道如何让西皮解决问题。任何建议将不胜感激。

共有1个答案

庞元青
2023-03-14

在这种情况下,您可以使用numpy中的log功能。自由党。scimath当其参数为负数时返回复数。

代替使用scipy.optimize.fsolve,使用scipy.optimize.root并将该方法更改为lm,该方法使用Levenberg-Maraqudt的修改在最小二乘意义上求解非线性方程组算法。有关更多方法,请参阅留档。

from scipy.optimize import root

import numpy.lib.scimath as math

# some global variables
m = 46.663
chi = 1.1500799949128826

def binodal_fsolve():
    def equations(p):
        x, y = p
        out = []
        out.append(math.log(x) + 1. - ((1. + (m - 1)*x) / m) + chi * (1 - x)**2 - (math.log(y) + 1. - ((1. + (m - 1)*y) / m) + chi * (1 - y)**2))
        out.append(math.log(1 - x) - (m - 1)*x + chi*m*x**2 - (math.log(1 - y) - (m - 1)*y + chi*m*y**2))

        return out

    initial_guess = [0.3, 0.99]
    #ans = fsolve(equations, initial_guess)
    ans = root(equations, initial_guess, method='lm')

    return ans

def test_answers(phiL, phiR):
    def functions(x):
        return math.log(x) + 1. - ((1. + (m - 1)*x) / m) + chi * (1 - x)**2, math.log(1 - x) - (m - 1)*x + chi*m*x**2

    return functions(phiL)[0], functions(phiR)[0], functions(phiL)[1], functions(phiR)[1]

print (test_answers(0.2542983070, 0.9999999274))
# (1.3598772108380786e-09, -1.5558330624053502e-09, -8.434988430355375, -8.435122589529684)
res = binodal_fsolve()
print (res)

其中给出了以下根xy数组([0.25429812, 0.99999993])

完整输出:

(1.3598772108380786e-09, -1.5558330624053502e-09, -8.434988430355375, -8.435122589529684)
/home/user/.local/lib/python3.6/site-packages/scipy/optimize/minpack.py:401: ComplexWarning: Casting complex values to real discards the imaginary part
  gtol, maxfev, epsfcn, factor, diag)
   cov_x: array([[6.49303571e-01, 8.37627537e-07],
       [8.37627537e-07, 1.08484856e-12]])
    fjac: array([[ 1.52933340e+07, -1.00000000e+00],
       [-1.97290115e+01, -1.24101235e+00]])
     fun: array([-2.22945317e-07, -7.20367503e-04])
    ipvt: array([2, 1], dtype=int32)
 message: 'The relative error between two consecutive iterates is at most 0.000000'
    nfev: 84
     qtf: array([-0.00338589,  0.00022828])
  status: 2
 success: True
       x: array([0.25429812, 0.99999993])

 类似资料:
  • 问题内容: 我有三个未知数4非线性方程,和我想要解决。等式的形式为: …其中,和是取决于四个方程式中每个值的常数。 解决此问题的最佳方法是什么? 问题答案: 有两种方法可以做到这一点。 使用非线性求解器 线性化问题并以最小二乘法解决 设定 因此,据我所知,您知道在4个不同点处的F,a,b和c,并且想要对模型参数X,Y和Z求逆。我们有3个未知数和4个观测数据点,因此这个问题太确定了。因此,我们将在最

  • 我正在研究一个非线性微分方程求解器。我能得到一般的解决方案,但不能得到具体的解决方案。当我试图找到集成常量时,我得到了错误:E_x不可调用的,我的解决方案被归类为一个列表,所以我不能在其中替换任何东西。 这是我的代码: 我在上得到了可调用错误,在我在书中的例子(数值Python)解决了一个线性ODE,但没有得到这个错误。有没有一种不同的方法来解决非线性DE,或者将E定义为可调用的,而将E_sol定

  • 问题内容: 我只是从“ 使用Python进行工程中的数值方法”中 测试一个示例。 当我运行它时,它显示以下错误: 我将其范围缩小到了日志,因为当我删除日志并添加其他功能时,它可以工作。我认为这是由于对底座的某种干扰,我不知道怎么做。谁能提出解决方案? 问题答案: 您的代码执行的a小于或等于零。从数学上来说这是未定义的,因此Python的函数会引发异常。这是一个例子: 不知道函数的作用,我不确定是否

  • 试图找出我出错的原因。我的数字介于-1和1之间,但仍然有错误。 数学域错误 有什么想法吗? 谢谢

  • 我正试图找到一个用Python解决一个非线性超定系统的好方法。我在这里查看了优化工具http://docs.cipy.org/doc/scipy/reference/optimize.nonlin.html,但我不知道如何使用它们。到目前为止我所掌握的是 你能帮我一下吗?

  • @错误:使用序列设置数组元素 我试图确定下行风险。 我有一个回报形状的二维数组(1000,10),投资组合从100美元开始。在一行中每一个回报复合10次。对所有行都这样做。将每一行的最后一个单元格的值与最后一列值的平均值进行比较。如果值小于平均值或为零,则保留该值。所以我们将有一个(1000,1)数组。最后我找到了它的均方差。 目标是最小化均方差。约束:权重需要小于1 预期回报,即wt*ret应等