On May 25, 2009, at 11:56 AM, Luke wrote:

>
> Here is the link for the Maxima trigsimp() code.  It was written in
> 1981, according to the comments!!!
> http://maxima.cvs.sourceforge.net/viewvc/maxima/maxima/share/trigonometry/trgsmp.mac?revision=1.4&view=markup
>
> I emailed the authors of the Fu et al. paper to see if they would be
> willing to share their implementation of the algorithm -- maybe we can
> save ourselves some work this way.
>
> I want to start coding for this, because much of the stuff I am doing
> in PyDy is heavy on kinematics and the expressions become excessively
> long unless intelligent trigsimplification is possible.  Many of my
> unittests simply will not work because some results I know to be true
> cannot be achieved with the current state of trigsimp, so this has
> become a significant limitation for me.
>
> What should be the general framework for implementing the 'rules' that
> are laid out in the Fu paper?  There are certainly other rules we
> could find, either on Wikipedia, Mathworld, or in a engineering/
> mathematics reference manual.
>
> I have read over how trigsimp() and trigsimp_nonrecursive() are
> currently implemented, and I think I get the gyst of what the approach
> is.  Can somebody explain what this is doing exactly:
> for pattern, simp in matchers:
>        res = result.match(pattern)
>        ....
>
> I'm not 100% clear on the use of the .match() method, does somebody
> have a quick example of use?
>
This should be res = ret.match(pattern).

match() takes a wildcard expression and matches it into a dictionary.   
In the code above, pattern is each of the items in the list  
((a*sin(b)**2, a - a*cos(b)**2),(a*tan(b)**2, a*(1/cos(b))**2 - a), 
(a*cot(b)**2, a*(1/sin(b))**2 - a)) (it runs a for loop).  a, b and c  
are wild cards, to it will try to take the expression result and find  
what a, b, and c are equal to.

For example, consider the first one: a*sin(b)**2.  If your ret ==  
4*x*sin(x**2)**2, then running res = ret.match(a*sin(b)**2) will  
return the dictionary {a: 4*x, b: x**2}.  You can then access a and b  
from res[a] and res[b].

You should also probably be aware of the exclude option on Wild.  If  
you do a = Wild('a', exclude=[sin(x)]), then a will not match anything  
with sin(x) in it.  Do help(x.matches) for another example.
> It seems like the flow of trigsimp (in the case of recursive==False
> and deep==False):
> 1)  call trigsimp_nonrecursive(expr, deep==False), store the result in
> 'result'
> 2)  do some final pattern matching on 'result', currently this will
> only simplify a*sin(b)**c/cos(b)**c --> a*tan(b)**c
>
> So, should all the rules in Fu et al. be implemented as a tuple of
> length 2 tuples, similar to the existing matchers tuple?
>
> I'm kind of thinking out loud right now and trying to figure out the
> next step to take....
>
> ~Luke
>
>
> On May 21, 7:42 am, Akshay Srinivasan <akshaysriniva...@gmail.com>


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sympy" group.
To post to this group, send email to sympy@googlegroups.com
To unsubscribe from this group, send email to sympy+unsubscr...@googlegroups.com
For more options, visit this group at http://groups.google.com/group/sympy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to