繁体   English   中英

你如何在 python 上使用 fsolve 求解非线性方程?

[英]How do you solve a non-linear equation using fsolve on python?

我试图使用下面的代码作为指导,以解决非线性方程,但我继续收到错误,例如“对象对于所需数组太深”和“函数调用的结果不是正确的浮点数组”。

from scipy.optimize import fsolve
from math import exp

def equations(vars):
    x, y = vars
    eq1 = x+y**2-4
    eq2 = exp(x) + x*y - 3
    return [eq1, eq2]

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

print(x, y)

我的代码将在下面发布。 它指出了“Q = fsolve(equations, 1)”行上的错误

%reset -f
from math import *
T = 4 # N·m
ω = 1800*(pi/30) # rad/s
A1 = .00131 # m^2
A2 = .00055 # m^2
P1 = 12000 # Pa
P2 = 200000 # Pa
ρ = 1000 # kg/m^3
μ = .89e-3 # N·s/m^2
η = .57 # % efficiency
g = 9.81 # m/s^2
γ = 9810 # N/m^3
Z2 = .7 # m

P_motor = T*ω
print(P_motor)

P_pump = P_motor*η
print(P_pump)

from scipy.optimize import fsolve

def equations(vars):
   Q = vars 
   eq1 = γ*Q*( ((P2-P1)/γ) + ( ( ( (Q**2) / (A2**2) ) - ( (Q**2) / (A1**2) ) )/2*g) + Z2) - P_pump
   return [eq1]
                    
Q = fsolve(equations, 1)

print(Q)

由于您只有一个带有一个未知变量的方程,因此您无需将输出放入列表中。 您可以将return [eq1]替换为return eq1

新代码将是:

%reset -f
from math import *
T = 4 # N·m
ω = 1800*(pi/30) # rad/s
A1 = .00131 # m^2
A2 = .00055 # m^2
P1 = 12000 # Pa
P2 = 200000 # Pa
ρ = 1000 # kg/m^3
μ = .89e-3 # N·s/m^2
η = .57 # % efficiency
g = 9.81 # m/s^2
γ = 9810 # N/m^3
Z2 = .7 # m

P_motor = T*ω
print(P_motor)

P_pump = P_motor*η
print(P_pump)

from scipy.optimize import fsolve

def equations(vars):
   Q = vars 
   eq1 = γ*Q*( ((P2-P1)/γ) + ( ( ( (Q**2) / (A2**2) ) - ( (Q**2) / (A1**2) ) )/2*g) + Z2) - P_pump
   return eq1

Q = fsolve(equations, 1)

print(Q)

输出:

753.9822368615503
429.7698750110836
[0.0011589]

文档指出

func : 可调用 f(x, *args)
一个函数,它至少接受一个(可能是向量)参数,并返回一个相同长度的值。

如果您的输入是一个包含 2 个值的列表,则期望该函数返回相同形状的内容。 所以在你的第一个例子中,你传递[x,y]并返回[eq1, eq2] ,所以它有效,但在第二种情况下,你传递一个标量并返回一个列表

因此,您可以将输入更改为Q = fsolve(equations, (1,))或将返回值更改为return eq1

def equations(vars):
   Q = vars 
   eq1 = γ*Q*( ((P2-P1)/γ) + ( ( ( (Q**2) / (A2**2) ) - ( (Q**2) / (A1**2) ) )/2*g) + Z2) - P_pump
   return eq1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM