[Date Index]
[Thread Index]
[Author Index]
Re: I am having some problem manipulating mathematica
*To*: mathgroup at smc.vnet.net
*Subject*: [mg91650] Re: I am having some problem manipulating mathematica
*From*: Bob Hanlon <hanlonr at cox.net>
*Date*: Sun, 31 Aug 2008 04:30:48 -0400 (EDT)
*Reply-to*: hanlonr at cox.net
expr = {a*Sin[y*x]*x^2 - x^3 + Cos[Tan[x + y] + b*(y/Exp[c*x])],
c*x^2 + Log[d*(x*y)]};
Separate the expressions into terms
expr2 = List @@@ expr
{{-x^3, Cos[(b*y)/E^(c*x) +
Tan[x + y]], a*x^2*Sin[x*y]},
{c*x^2, Log[d*x*y]}}
f@@@expr is shorthand for Apply[f,expr,{1}]
Remove jagged edges of expr2
expr3 = PadRight[expr2]
{{-x^3, Cos[(b*y)/E^(c*x) +
Tan[x + y]], a*x^2*Sin[x*y]},
{c*x^2, Log[d*x*y], 0}}
coef = Array[p, Dimensions[expr3]]
{{p[1, 1], p[1, 2], p[1, 3]},
{p[2, 1], p[2, 2], p[2, 3]}}
Sum the rows
expr4 = Total /@ (coef*expr3)
{(-p[1, 1])*x^3 + a*p[1, 3]*
Sin[x*y]*x^2 +
Cos[(b*y)/E^(c*x) + Tan[x + y]]*
p[1, 2], c*p[2, 1]*x^2 +
Log[d*x*y]*p[2, 2]}
Put all of this into a Module
myFunction[x_List, p_Symbol] := Module[
{expr = List @@@ x},
expr = PadRight[expr];
Total /@ (Array[p, Dimensions[expr]]*expr)]
Verify that myFunction produces the same results
expr4 == myFunction[expr, p]
True
I recommend that you use coefficients of the form p[i, j]; however, if this is unacceptable, you can use a replacement such as
expr5 = expr4 /. p[i_, j_] :>
ToExpression["p$" <> ToString[i] <>
"$" <> ToString[j]]
{(-p$1$1)*x^3 + a*p$1$3*Sin[x*y]*
x^2 + p$1$2*Cos[(b*y)/E^(c*x) +
Tan[x + y]], c*p$2$1*x^2 +
p$2$2*Log[d*x*y]}
Bob Hanlon
---- pratip <pratip.official at gmail.com> wrote:
=============
Hallo everybody,
I am having a small problem while dealing with the parts of a Mathematica expression. Here I give an example.
take the LHS of a system of equations
{a*Sin[y*x]*x^2-x^3+Cos[b*(y/Exp[c*x])]==0,
c*x^2+Log[d*(x*y)]==0}
Hence the expression is
{
a*Sin[y*x]*x^2-x^3+Cos[Tan[x+y]+b*(y/Exp[c*x])],
c*x^2+Log[d*(x*y)]
}
Now take the first expression
There we can see the three first level terms
{
a*Sin[y*x]*x^2,
x^3,
Cos[Tan[x+y]+b*(y/Exp[c*x])
}
separated with {+,-,+}
Now how to Count how many such parts exists in general?
Because I want to get every single term multiplied with different symbols. Here we have three terms in the first expression so we must get
{p$1*(a*Sin[y*x]*x^2)-p$2*(x^3)+p$3*(Cos[Tan[x+y]+b*(y/Exp[c*x])]}
Hence I am trying to write a function that is defined like this
MyFunction[x_List]:={List[y],List[p]}
and works like this
Input:
{
a*Sin[y*x]*x^2-x^3+Cos[Tan[x+y]+b*(y/Exp[c*x])],
c*x^2+Log[d*(x*y)]
}
Output:
{
{p$11*(a*Sin[y*x]*x^2)-p$12*(x^3)+p$13*(Cos[Tan[x+y]+b*(y/Exp[c*x])]),p$21*(c*x^2)+p$22*(Log[d*(x*y)])},
{p$11,p$12,p$13,p$21,p$22}
}
I don't think it is too difficult for people of your skills. But I don't know a very nice way to do it when the starting equation system can have any number of equations and LHS of every equation can have any number of first level terms combined with "+" or "-". It might also occur that some equations will have just a single term LHS e.g "x^2==0".
So that was the primary problem. It will be even better (actually that is the real thing I am looking for) if it is possible to extend this operation on every higher part level recursively. That means to multiply part of a part with symbols like before. For example if we have the following equation
Cos[Tan[x+y]+b*(y/Exp[c*x])]==0 we have
Input:
{Cos[Tan[x+y]+b*(y/Exp[c*(x+Sin[x+y])])]}
Output:
{
{p$1$1$1*(Cos[Tan[p$1$2$1*x+p$1$2$2*y])+p$1$1$2*(b*(y/Exp[p$1$2$3*c*(x+Sin[p$1$3$1*x+p$1$3$2*y])]))])},
{{p$1$1$1,p$1$1$2},
{p$1$2$1,p$1$2$2,p$1$2$3},
{p$1$3$1,p$1$3$2}}
}
Down is the explanation of this above notation
*****What is i*****
The meaning of the symbol p$i$j$k is as follows
"i" denotes the number of main expression p occurs. Here we had only one expression so all i is equal to one. If we had two expressions some p will be like "p$2$j$k".
*****What is j*****
"j" denotes the level in the expression where p is getting multiplied. In the above example there are three parameter that occurs in the second level namely {p$1$2$1,p$1$2$2,p$1$2$3}.
*****What is k*****
"k" is meant for counting the p that occurs in a fixed level in a fixed expression.
I finally re grate that my message may seem too long for many of you though the question in it is not that much challenging at least mathematically. But I hope some of you might have a nice answer. My skill in Mathematica seems to be not enough to deal with this problem.I am feeling kind of hopeless.
Pratip
Prev by Date:
**Re: light-weight PC to run Mathematica?**
Previous by thread:
**Debugger**
| |