Don't monkeypatch Expr. If you're doing that, you're either doing something wrong, or there's something that needs to be added to SymPy.
All you need to do is define _eval_evalf, and then calling evalf on an expression containing your subclass will call that method and use the result. I don't know if there is any documentation for it, but the signature is _eval_evalf(self, prec), where prec is the precision in decimal digits. If you want to replace it with an exact value, rather than a numerical value, you can define a method called doit() that returns that value. Then call doit() on the top-level expression. Aaron Meurer On Wed, Jul 30, 2014 at 10:24 AM, Stewart Wadsworth <[email protected]> wrote: > Hello, > > I'm planning to use sympy for a project I'm working on and I have a few > questions... > > Basically I want to be able to associate a value with a symbol and then be > able to evaluate any function using that symbol for the value it's been > given. This would allow me to define properties in my classes as symbolic > functions but also be able to get the numeric value for the function at the > value specified for each symbol. > > Question 1: Is there already a built in way to do this without having to > call .subs() and .evalf() all over the place? (I'm pretty sure the answer is > "no" but I could have overlooked something....) > > Question 2: If not does this seem generally useful? Like something worth > incorporating into sympy? > > Question 3a: If it DOES seem like something worth incorporating: how can I > help? (I'm somewhat new to programming and don't have any formal > training...should I do a pull request and just do what I think is right?) > > Question 3b: If it DOES NOT seem like something worth incorporating: I > implemented this functionality by creating my own Symbol class and Monkey > patching the Expr class (copied the code below). Am I missing something > important here? I don't think this will break sympy... Is there a better way > to approach this? I'm a beginner so any feedback would be appreciated! > > > > CODE: > > class dSymbol(Symbol): > """ > Add a default value to Symbols > """ > > def __new__(cls, name, value, **assumptions): > return super().__new__(cls, name, **assumptions) > > def __init__(self, name, value, **assumptions): > self.default = value > > """ > Monkey patch the Expr class (inherited by Mul, Add,... all the function > classes in sympy i'm interested in using) > Add methods: > symvalue > value > """ > > def symvalue(self): > """ > returns the expression evaluated at the default value for each dSymbol > the result is still symbolic in that pi will be displayed as 'pi' not > '3.14159'... > """ > s = self.atoms(dSymbol) > for i in s: > self = self.subs(i, i.default) > return self > > def value(self, *args, **kwargs): > """ > returns the expression evaluated at the default value for each dSymbol > the result will be numeric (assuming it doesn't contain any 'Symbol') > """ > return self.symvalue().evalf(*args, **kwargs) > > Expr.symvalue = symvalue > Expr.value = value > > -- > 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/b12b7e28-aff2-4168-a3a2-c9f5ee67e1ad%40googlegroups.com. > For more options, visit https://groups.google.com/d/optout. -- 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/CAKgW%3D6JhzkBFir2AG4cYyR2MqJ5jowmO0FAnwSbhh_5%3DX1qFuQ%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.
