【发布时间】:2020-07-30 08:58:20
【问题描述】:
我是 Python 发起者,我想解决以下问题,但我不知道是什么原因。我使用 'fsolve' 一个优化工具解决了这个问题。
首先,我试图求解一个非线性方程,但我已经在两种情况下处理过它。一个案例效果很好。但我找不到另一个案例。
第一个案例(完整案例)
from sympy import *
from scipy.optimize import fsolve
import numpy as np
y= symbols('y')
b_1, b_2 = symbols ('b_1,b_2')
b = 1
f = b_1 + b_2*(y/b)**2
K1 = integrate(f**2,(y,0,b))
eq1 = diff(K1,b_1)
eq2 = diff(K1,b_2)
def function(v):
b_1 = v[0]
b_2 = v[1]
return (2*b_1 + 2*b_2/3,2*b_1/3 + 2*b_2/5)
x0 = [1,1]
solutions = fsolve(function,x0)
sol = np.zeros(2)
sol[0] = solutions[0]
sol[1] = solutions[1]
sol
Out[413]: array([-5.e-324, 1.e-323])
第二种情况(失败情况)
from sympy import *
from scipy.optimize import fsolve
import numpy as np
y= symbols('y')
b_1, b_2 = symbols ('b_1,b_2')
b = 1
f = b_1 + b_2*(y/b)**2
K1 = integrate(f**2,(y,0,b))
eq1 = diff(K1,b_1)
eq2 = diff(K1,b_2)
def function(v):
b_1 = v[0]
b_2 = v[1]
return (eq1,eq2)
x0 = [1,1]
solutions = fsolve(function,x0)
sol = np.zeros(2)
sol[0] = solutions[0]
sol[1] = solutions[1]
失败的消息如下。
runfile('C:/Users/user/Desktop/******/untitled0.py', wdir='C:/Users/user/Desktop/******')
Traceback (most recent call last):
File "C:\Users\user\AppData\Roaming\Python\Python37\site-packages\sympy\core\expr.py", line 327, in __float__
raise TypeError("can't convert expression to float")
TypeError: can't convert expression to float
Traceback (most recent call last):
File "C:\Users\user\Desktop\*******\untitled0.py", line 29, in <module>
solutions = fsolve(function,x0)
File "C:\Users\user\anaconda3\lib\site-packages\scipy\optimize\minpack.py", line 147, in fsolve
res = _root_hybr(func, x0, args, jac=fprime, **options)
File "C:\Users\user\anaconda3\lib\site-packages\scipy\optimize\minpack.py", line 225, in _root_hybr
ml, mu, epsfcn, factor, diag)
error: Result from function call is not a proper array of floats.
只需将数学表达式eq1,eq2直接输入到'Return'中,但结果与手动输入表达式不同。
我尝试了很多方法将“sympy 函数”转换为“浮点数组”,但效果不佳。
我尝试了 'lambdify'、'lambda'...这些也都失败了。
如何以浮点形式输入定义为“sympy”的函数以使用优化工具“fsolve”进行计算?
实际上,上面的代码不是我的情况。因为它只是简化的情况。但在我的情况下,不可能像上面那样手动输入所有函数,因为我要求解一个非常复杂的非线性方程,它有数百个十阶或更高阶的项。
有没有人能解决这个问题?
【问题讨论】:
-
sympy表达式不能在numpy或scipy中可靠地使用。scipy求解器需要一个 numpy/python 函数,而不是一个使用 sympy 符号的函数。如果您无法让lambdify工作,请坚持使用 sympy 求解器。
标签: python numpy class scipy sympy