首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Sympy plot:使用多个自由变量绘制函数(python 3.6)

Sympy plot:使用多个自由变量绘制函数(python 3.6)
EN

Stack Overflow用户
提问于 2018-08-08 07:27:05
回答 1查看 580关注 0票数 0

首先,我能画出我声明为函数的东西吗?因为我收到了大量的错误,但它没有显示出错误来自于我的代码中的哪里,例如:

代码语言:javascript
复制
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)

然后我得到:

代码语言:javascript
复制
---------------------------------------------------------------------------
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: 

其次,我想将t = 0s的值绘制为t = 10s,并且我只想要t = [2,7]o = 100。我已经这样做了,但我不知道我错在哪里:

代码语言:javascript
复制
import sympy as sy
sy.init_printing()

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

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)

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

代码语言:javascript
复制
o= np.zeros(100) # % Valve opening 
o[21:70] = 100 # % opening at times 2s to 7s
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-08 07:38:30

sy.plot(t, h)存在问题的原因有很多。首先,在SymPy的plot中,函数位于变量之前:例如,sy.plot(t**2, (t, 0, 3))

其次,您对ODE所做的任何操作都不会对th产生任何影响。您只是试图用sy.Function('h')绘制一些东西,而没有任何关于h是什么的指示。SymPy对象不会发生变化;除非您给h赋值,否则它不会发生变化。

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

代码语言:javascript
复制
sol = sy.dsolve(m_bal, h(t), ics={h(0): 0})
sy.plot(sol.rhs, (t, 0, 3))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51736740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档