[英]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.