Re: solve for a squared variable
- To: mathgroup at smc.vnet.net
- Subject: [mg60462] Re: solve for a squared variable
- From: Peter Pein <petsie at dordos.net>
- Date: Sat, 17 Sep 2005 02:31:44 -0400 (EDT)
- References: <200509150916.FAA15860@smc.vnet.net> <200509160749.DAA00670@smc.vnet.net> <a6e65e8d05091601107c5e6f8a@mail.gmail.com> <dge3qf$52t$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Ruth Lazkoz schrieb:
> Thank you. I was aware of that possibility. I was only wondering if there is
> a more elegant procedure, perhaps using patters or whatever.
> ----- Original Message -----
> From: "Zhengji Li" <zhengji.li at gmail.com>
To: mathgroup at smc.vnet.net
> Subject: [mg60462] [work] Re: solve for a squared variable
>
>
>
>>That's because x^2 is not recognized as a symbol.
>>
>>let t = x ^ 2, then Solve[t + y == 1, t], you will get the result
>>immediately.
>>
>>--
>>Li Zhengji
>>-------------------------------------------------------------
>>If all you have is a hammer, everything is a nail.
>>-------------------------------------------------------------
>>
>
>
Hi Ruth,
I guess you have a function in mind, which does this:
In[9]:=
SolveExpression[x^2 + y == 1, x^2]
Out[9]=
{{x^2 -> 1 - y}}
or even this:
In[10]:=
SolveExpression[{Tan[t] == b/a, c Cos[t] == a}, a^2 + b^2]
Out[10]=
{{a^2 + b^2 -> c^2}}
?
Well, far from being elegant, the function in this q&d hack does it
(almost surely with as many bugs as possible):
Needs["Utilities`FilterOptions`"];
Clear[SolveExpression];
Options[SolveExpression] ^= UseReduce -> False;
(* when to solve for symbols only, use built - in functions *)
SolveExpression[eqns_List,
vars_List /; Union[Head /@ vars] === {Symbol}, opts___] :=
Module[{f = If[TrueQ[UseReduce /. {opts}], Reduce, Solve]},
f[eqns, vars, FilterOptions[f, opts]]
];
SolveExpression[eqns_List, vars_List, opt___] :=
Module[{eq2, va2, t, nosyms, syms, sol, nsvars,
usered = TrueQ[UseReduce /. {opt}],
varnames = Cases[#1, x_Symbol /; !NumericQ[x], Infinity] & },
nosyms = Complement[vars, syms = varnames[vars]];
t = Table[Unique[], {Length[nosyms]}];
eq2 = Join[eqns, Thread[t == nosyms]];
va2 = Join[syms, t];
nsvars = varnames[nosyms];
sol = If[usered,
Reduce[eq2, va2, Backsubstitution -> True,
FilterOptions[Reduce, opt]],
Solve[eq2, va2, nsvars, FilterOptions[Solve, opt]]
] /. Thread[t -> nosyms];
sol = sol /. (Rule | Equal)[x_, _] | _ == (x_) /; MemberQ[nsvars,
x] :> Sequence[];
If[usered,
LogicalExpand[sol] /. (a_) == (b_) /; MemberQ[vars, b] :> b == a,
Union[sol]
]
];
SolveExpression[e_List, v_, o___] := SolveExpression[e, {v}, o];
SolveExpression[e_, v_List, o___] := SolveExpression[{e}, v, o];
SolveExpression[e_, v_, o___] := SolveExpression[{e}, {v}, o];
--
Peter Pein, Berlin
GnuPG Key ID: 0xA34C5A82
http://people.freenet.de/Peter_Berlin/
- References:
- Re: Why this function does not return a single value
- From: Bill Rowe <readnewsciv@earthlink.net>
- solve for a squared variable
- From: "Ruth Lazkoz" <ruth.lazkoz@ehu.es>
- Re: Why this function does not return a single value