scipy 如何在python中数值求解超定非线性方程组?

bkhjykvo  于 2023-03-08  发布在  Python
关注(0)|答案(1)|浏览(233)

我试图解决一个系统的4个指数方程与两个变量。然而,如果我使用fsolve python将只允许我两个使用尽可能多的方程,我有变量。但由于我有无限多的解决方案对(如果只有两个方程被使用),我需要找到一对变量,不仅适合两个,但所有四个方程,fsolve似乎不工作。
我的代码看起来像这样:

from scipy.optimize import fsolve
c_1 = w+(y/(x*R))
c_2 = offset - (c_1/(x*R)) #offset(1.05), w(10) and R(0.35) are constants 
def equations(p):
    x,y = p
    eq1 = (c_1*sp.exp(-y*R*1.017))/(y*R)+c_2-(x*1.017)/(y*R)-(5.1138*2*np.pi)
    eq2 = (c_1*sp.exp(-y*R*2.35))/(y*R)+c_2-(x*2.35)/(y*R)-(2.02457*4*np.pi)
    eq3 = (c_1*sp.exp(-y*R*2.683))/(y*R)+c_2-(x*2.683)/(y*R)-(6.0842178*4*np.pi)
    return (eq1,eq2,eq3)

x, y =  fsolve(equations, (1,1))

print (equations((x, y)))

然而,根据我最初的猜测,这会给予我带来非常不同的结果。我现在想编辑这段代码,这样我就可以添加额外的方程,以保证我得到正确的x,y对作为解。简单地添加第三个方程到函数中,当然会返回TypeError,所以我想知道如何才能做到这一点。

neekobn8

neekobn81#

要添加任意数量的方程,我不认为你可以使用fsolve。只需运行最小二乘最小化,并确保你的向量化正确,而不是死记硬背的重复。下面的运行并生成一个结果,虽然我还没有评估它的准确性。

import numpy as np
from scipy.optimize import minimize

offset = 1.05
w = 10
R = 0.35
a = np.array((-1.017, -2.350, -2.683))
b = np.array((
    -5.1138000*2,
    -2.0245700*4,
    -6.0842178*4,
))*np.pi

def equations(x: float, y: float) -> np.ndarray:
    c_1 = w + y/x/R
    c_2 = offset - c_1/x/R

    return (c_1*np.exp(a*y*R) + a*x)/y/R + c_2 + b

def error(xy: np.ndarray) -> np.ndarray:
    eqs = equations(*xy)
    return eqs.dot(eqs)

result = minimize(
    fun=error,
    x0=(1, 1),
    method='nelder-mead',
)
print(result.message)
print('x, y =', result.x)
print('equations:', equations(*result.x))
Optimization terminated successfully.
x, y = [0.19082078 0.13493941]
equations: [ 27.4082168   13.91087443 -42.00388728]

相关问题