如何解决在使用 fsolve() 求解之前将 sympy 表达式转换为 numpy 表达式
def test1a(A):
t,tt = sym.symbols('t tt')
return sym.cos(t+tt+A)*A
def test1b(B):
t,tt = sym.symbols('t tt')
return sym.sin(t-tt+B)*B
我想在使用 fsolve()
评估结果之前转换为 numpy 表达式:
def testprep(variables,A,B):
t,tt = sym.symbols('t tt')
fA = lambdify([(t,tt)],test1a(A))
fB = lambdify([(t,test1b(B))
t,tt = variables
return [fA,fB]
def testsolve(A,B):
print(so.fsolve(testprep,[-1,1],args = (A,B)))
return
运行时,我得到以下结果:
import scipy.optimize as so
import sympy as sym
from sympy.utilities.lambdify import lambdify as lambdify
import numpy as np
def main():
A = 1
B = 2
testsolve(A,B)
return
if __name__ == '__main__':
main()
输出:
error: Result from function call is not a proper array of floats.
作为健全性检查,我根据 numpy 表达式起草了相同的系统并解决了它:
def standard(variables,tt = variables
eq1 = np.cos(t+tt+A)*A
eq2 = np.sin(t-tt+B)*B
return [eq1,eq2]
def solvestandard(A,B):
print(so.fsolve(standard,np.array([-1,1]),B)))
return
有输出:
[-0.71460184 1.28539816]
我是 lambdify( )
的新手,对从 sympy 转换为 numpy 的过程不太熟悉。为了使测试用例工作,我需要改变什么?
解决方法
您已针对 SO 问题以非常复杂的方式展示了您的代码。你不需要那么多函数来展示什么基本上是5行代码!
请将您的示例简化为尽可能简单的代码,即可以复制粘贴完成所有导入的单个代码块。然后请通过复制粘贴并在新的 python 进程中运行来测试它。
将 lambdify
与 fsolve
结合使用的方式类似于:
import sympy as sym
import scipy.optimize as so
t,tt = sym.symbols('t tt')
A,B = 1,2
eq1 = sym.cos(t+tt+A)*A
eq2 = sym.sin(t-tt+B)*B
f = lambdify([(t,tt)],[eq1,eq2])
print(so.fsolve(f,[-1,1]))
这个想法是,lambdify 制作了一个可以多次计算的高效函数(例如,fsolve
将迭代调用它)。然后你将该高效函数传递给 fsolve
。
您传递给 fsolve
的函数不应调用 lambdify
本身(如您的 testprep
所做的那样),因为 lambdify
比评估函数慢得多:>
In [22]: %time f = lambdify([(t,eq2])
CPU times: user 4.74 ms,sys: 77 µs,total: 4.82 ms
Wall time: 4.96 ms
In [23]: %time f([1,2])
CPU times: user 36 µs,sys: 1e+03 ns,total: 37 µs
Wall time: 41 µs
Out[23]: [-0.6536436208636119,1.682941969615793]
也许你真正的问题更复杂,但我会使用 sympy 的 nsolve
来解决这样的问题:
In [16]: nsolve([eq1,eq2],[t,tt],1])
Out[16]:
⎡-0.714601836602552⎤
⎢ ⎥
⎣ 1.28539816339745 ⎦
In [17]: nsolve([eq1,1],prec=100)
Out[17]:
⎡-0.714601836602551690384339154180124278950707650156223544756263851923045898428447750342991293664470733⎤
⎢ ⎥
⎣1.285398163397448309615660845819875721049292349843776455243736148076954101571552249657008706335529267 ⎦
SymPy 的 nsolve
负责为您调用 lambdify
。它比 fsolve
稍慢,因为它适用于任意精度的浮点数,但这意味着它也可以计算出更准确的结果。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。