Sympy plot:绘制具有多个自由变量的函数(python 3.6)

Sympy plot:绘制具有多个自由变量的函数(python 3.6),python,python-3.x,plot,sympy,Python,Python 3.x,Plot,Sympy,首先,我可以画一些我声明为函数的东西吗?因为我收到了大量的错误,但它没有显示错误在我的代码中来自何处,例如: import sympy as sy rho = 1000 # Density of water [kg/m3] A = 1.0 # Cross-sectional area of tank [m2] c = 50 # Valve constant [kg/s per opening percent] o = 100 # Percent valve opening h = sy.F

首先,我可以画一些我声明为函数的东西吗?因为我收到了大量的错误,但它没有显示错误在我的代码中来自何处,例如:

import sympy as sy

rho = 1000 # Density of water [kg/m3]
A = 1.0 # Cross-sectional area of tank [m2]
c = 50 # Valve constant [kg/s per opening percent]
o = 100 # Percent valve opening 

h = sy.Function('h')
t = sy.symbols('t')

m_bal = sy.Eq(h(t).diff(t),c/(rho*A)*o)
gen_sol = sy.dsolve(m_bal,h(t))
C = gen_sol.subs([(t,0),(h(0),0)])
sol = gen_sol.subs([(C.rhs,C.lhs)])
sy.plot(t,h)
然后我得到:

---------------------------------------------------------------------------
AssertionError                            Traceback (most recent call last)
<ipython-input-54-7aa8880d452a> in <module>()
     14 C = gen_sol.subs([(t,0),(h(0),0)])
     15 sol = gen_sol.subs([(C.rhs,C.lhs)])
---> 16 sy.plot(t,h)

~\Anaconda3\lib\site-packages\sympy\plotting\plot.py in plot(*args, **kwargs)
   1288     show = kwargs.pop('show', True)
   1289     series = []
-> 1290     plot_expr = check_arguments(args, 1, 1)
   1291     series = [LineOver1DRangeSeries(*arg, **kwargs) for arg in plot_expr]
   1292 

~\Anaconda3\lib\site-packages\sympy\plotting\plot.py in check_arguments(args, expr_len, nb_of_free_symbols)
   1791 
   1792         exprs = args[:i]
-> 1793         assert all(isinstance(e, Expr) for expr in exprs for e in expr)
   1794         free_symbols = list(set().union(*[e.free_symbols for expr in exprs
   1795                                         for e in expr]))

AssertionError: 
我可以在Symphy上执行此操作吗?还是必须使用matplotlib和numpy并执行以下操作:

o= np.zeros(100) # % Valve opening 
o[21:70] = 100 # % opening at times 2s to 7s
sy.由于多种原因,绘图(t,h)
存在问题。首先,在Symphy的
plot
中,函数位于变量之前:例如,
sy.plot(t**2,(t,0,3))

其次,您对ODE所做的任何操作都不会对
t
h
产生任何影响。您只是试图用
sy.Function('h')
绘制一些东西,而没有指示
h
是什么。SymPy对象不会发生变异;除非您将某些内容分配给
h
,否则它不会更改

强制执行初始条件的尝试看起来也很奇怪。在当前版本的SymPy(1.2)中,初始条件可以由
dsolve
本身施加。这就是我将如何解决和绘制解决方案:

sol = sy.dsolve(m_bal, h(t), ics={h(0): 0})
sy.plot(sol.rhs, (t, 0, 3))

当我使用ics={}然后打印解决方案时,积分常数仍然没有被值替换。但是当我绘制它时,它考虑了初始条件。如何替换该常数?谢谢你的帮助,这就是我为什么写“在当前版本的SymPy(1.2)”的原因。在旧版本(如您的)中,请参阅
sol = sy.dsolve(m_bal, h(t), ics={h(0): 0})
sy.plot(sol.rhs, (t, 0, 3))