Re: Using results of "Solve"
- To: mathgroup at smc.vnet.net
- Subject: [mg25764] Re: [mg25693] Using results of "Solve"
- From: BobHanlon at aol.com
- Date: Sat, 21 Oct 2000 18:33:00 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
In a message dated 10/19/2000 5:35:06 AM,
helgek at studserv.stud.uni-hannover.de writes:
>I have a series of matrices which depend on several parameters. I can
>create those matrices fine and display them. They are called
>
>S[k_,m_,b_,n_]
>
>Now there is an unkown called "q" in the matrix which is evaluated by
>setting the determinant of the matrix zero and solving the resulting
>equation for q:
>
>Solve[Det[S[2, m, b, 2]] == 0, q]
>
>Now I want to use this function. The result is given in a form like:
>{{ q -> rhs1 },{ q -> rhs2}} and so on. I would like now to plot q.
>
>A colleque gave me the following "hack":
>h =.;
>h[m_, b_] := Solve[Det[S[2, m, b, 2]] == 0, q];
>Plot3D[q /. h[m, b] [[2]], {m, 0, 3}, {b, 0, 3}]
>
>Is there a more straightforward way ? Especially I would like to create
>several functions this way and their sum is the resulting function I
>am interested in (actually it's a series).
>
S[k_, m_, b_,
n_] := {{k*q + m + b + n , k + m + b - n}, {k*q + m - b + n,
k*q - m + b + n}};
Your approach is fine; however, to the extent possible and practicable, you
should define functions so that they are evaluated only once. For example,
Clear[detS];
detS[k_, m_, b_, n_] := Det[S[k, m, b, n]];
?detS
Global`detS
detS[k_, m_, b_, n_] := Det[S[k, m, b, n]]
Note that the deterimant of S would be evaluated for each call. Compare this
with
Clear[detS];
detS[k_, m_, b_, n_] := Evaluate[Det[S[k, m, b, n]]];
?detS
Global`detS
detS[k_, m_, b_, n_] := 2*b^2 + b*k - k*m - 2*m^2 - k*n + 2*n^2 + b*k*q -
k^2*q - k*m*q + 3*k*n*q + k^2*q^2
For functions which are not too complex, it may be worthwhile to Simplify the
result as part of the definition.
Clear[detS];
detS[k_, m_, b_, n_] := Evaluate[FullSimplify[Evaluate[Det[S[k, m, b, n]]]]];
?detS
Global`detS
detS[k_, m_, b_, n_] := 2*b^2 + b*k*(1 + q) + (-2*m + 2*n + k*(-1 + q))*(m +
n + k*q)
Similarly,
Clear[h];
h[m_, b_] := Solve[detS[2, m, b, 2] == 0, q];
?h
Global`h
h[m_, b_] := Solve[detS[2, m, b, 2] == 0, q];
Clear[h];
h[m_, b_] := Evaluate[Solve[detS[2, m, b, 2] == 0, q]];
?h
Global`h
h[m_, b_] := {{q -> (-4 - b + m - Sqrt[-7*b^2 - 2*b*m + 9*m^2])/4},
{q -> (-4 - b + m + Sqrt[-7*b^2 - 2*b*m + 9*m^2])/4}}
Off[Plot3D::gval];
(p2 = Plot3D[q /. h[m, b] [[2]], {m, 0, 3}, {b, 0, 3}]) // Timing
(p1 = Plot3D[q /. h[m, b] [[1]], {m, 0, 3}, {b, 0, 3},
PlotPoints -> 25]) // Timing
Off[Graphics3D::nlist3];
Show[{p1, p2}];
Bob Hanlon