You may assume variables to be positive/negative, for now. Sage uses a lot of backends. In case of *assume(zeta > 1)*, I believe it relies on Maxima, which can handle that kind of assumptions.
SymPy's aim, on the other hand, is to implement all the algorithms on its own. Assumptions with inequalities look like they are not yet supported, but I suppose they will be supported by a syntax similar to this one, as soon as the algorithm handling them will be finished: from sympy.assumptions.assume import global_assumptions global_assumptions.add(Q.positive(zeta - 1)) (Note: this code doesn't currently work as expected) On Thursday, 3 September 2015 18:19:38 UTC+2, Carl Sandrock wrote: > > I am trying to build a workbook to illustrate the effect of various > parameters of second order transfer functions. The full workbook is on > GitHub > <http://nbviewer.ipython.org/github/alchemyst/Dynamics-and-Control/blob/master/Second%20order%20systems.ipynb>, > > but here is a minimal example of the problem: > > import sympy > > tau, zeta, t, w, K = sympy.symbols('tau, zeta, t, w, K', real=True, > positive=True)s = sympy.Symbol('s') > > > G = K/(tau**2*s**2 + 2*tau*zeta*s + 1) > > > The impulse response of the second order system is simply the inverse Laplace > of G. However, the nature of the inverse depends on the parameter ζ. > TAttempting directly to calculate the inverse results in > > > TypeError: cannot determine truth value of > > -zeta/tau - sqrt(zeta + 1)*cos(atan2(0, zeta - 1)/2)*sqrt(Abs(zeta - 1))/tau > < oo > > > There are three cases of interest, ζ>1, ζ=1 and 0<ζ<1 > > In Sage, I would be able to use assume(zeta > 1) before calculating the > inverse to obtain the correct version of the inverse, but I have not found a > way to impose such constraints in SymPy. So, first question is whether I can > find nice solutions for these cases to the inverse. > > > Failing that, I want at least to be able to calculate the inverse with known > values of all the parameters so that I can animate the response using IPython > notebook widgets. Here I have also been out of luck, as some cases result in > special values which are not cleanly evaluated to > > > knownbadvalues = [{K: 5.05, tau: 5., zeta: 1.}, > {K: 5.05, tau: 5.05, zeta: 1.05} > ]for values in knownbadvalues: > print sympy.inverse_laplace_transform(G.subs(values), s, t, noconds=True) > > (0.202*t - 0.404*EulerGamma - 0.404*polygamma(0, 1.0))*exp(-0.2*t) > 0.198019801980198*meijerg(((0.728681938243239, 0.855476477598345), ()), ((), > (-0.271318061756761, -0.144523522401655)), exp(t)) > > ts = numpy.linspace(0, tmax, 100) > > sympy.lambdify(t, invL(G.subs(values)), ['numpy', 'sympy'])(ts).n() > > > fails with "ValueError: sequence too large; must be smaller than 32" > Any advice on getting either getting the closed forms or just finding a > version which can be evaluated cleanly? > > -- You received this message because you are subscribed to the Google Groups "sympy" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/sympy. To view this discussion on the web visit https://groups.google.com/d/msgid/sympy/c731194a-56ad-4385-ab6a-b0e5514d74e0%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
