Re: Plotting symbolic representation of numerica function
- To: mathgroup at smc.vnet.net
- Subject: [mg54470] Re: Plotting symbolic representation of numerica function
- From: "Carl K. Woll" <carlw at u.washington.edu>
- Date: Mon, 21 Feb 2005 03:44:39 -0500 (EST)
- Organization: University of Washington
- References: <cv6rkr$6hd$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Mukhtar,
The reason you are getting error messages is because the right hand side of
your equation is not a list of two objects, like the left hand side is. On
the other hand, when using Set, the right hand side is evaluated, and
becomes a list of two objects if there are no errors. Of course, in your
example below Mathematica will not be able to evaluate the right hand side
since x will not be numerical.
At any rate, it seems to me that you ought to investigate the function
ImplicitPlot. If you can turn your system of two equations into a single
equation for either f1 or f2, then ImplicitSolve ought to be able to plot
it. If you can't or don't want to reduce the number of equations, then you
might be interested in a function I presented in the past called
ImplicitSolve. The usage message for ImplicitSolve is:
"ImplicitSolve[eqns, {x->x0,y->y0,...}, {x, xmin, xmax}, opts] finds a
numerical solution to the implicit equations eqns for
the functions y, ... with the independent variable x in the range xmin to
xmax. The root {x0,y0,...} should satisfy the equations, or should provide a
good starting point for finding a solution when using FindRoot. Options
which can be supplied with opts include those which can be provided to
FindRoot or NDSolve."
In your example, you would use ImplicitSolve as follows:
ImplicitSolve[{g1[f1,f2,x]==0,g2[f1,f2,x]==0},{x->x0,f1->f10,f2->f20},{x,a,b}]
where {x0,f10,f20} is a reasonable approximation to a root of the supplied
equations, and a and b are the endpoints of the range of x that you are
interested in. ImplicitSolve returns InterpolatingFunctions which you can
then plot.
The code for ImplicitSolve is given below.
Carl Woll
When copying the code below into mathematica, it's probably a good idea to
change your DefaultInputFormatType to InputForm before you cut and paste.
When I cut and paste the code below into a StandardForm input cell, I get
extraneous input which Mathematica treats as multiplication, so that running
the code produces output like Null^6. Cutting and pasting into an InputForm
input cell avoids this problem.
Clear[ImplicitSolve]
ImplicitSolve[eqn_List, rt_, {x_, min_, max_}, opts___?OptionQ] :=
Module[{x0, y, y0, ag},
ag = AccuracyGoal /. {opts} /. AccuracyGoal -> 6;
x0 = Cases[rt, (x -> a_) -> a];
If[x0 == {},
Message[ImplicitSolve::badroot, x];Return[],
x0 = x0[[1]]
];
{y, y0} = Transpose[DeleteCases[rt, x -> x0] /. Rule -> List];
If[!(And @@ Thread[Abs[eqn /. Equal -> Subtract /. rt] < 10^-ag]),
Message[ImplicitSolve::inaccurate];
y0 = FindRoot[Evaluate[eqn /. x->x0], Evaluate[Sequence@@Transpose[{y,
y0}]],opts][[All,2]],
Null,
Message[ImplicitSolve::incomplete]; Return[]
];
NDSolve[Flatten[{D[eqn /. Thread[Rule[y, #[x]& /@ y]], x], Thread[#[x0]&
/@ y == y0]}],
y, {x, min, max}, opts, PrecisionGoal -> ag]
]
ImplicitSolve::usage =
"ImplicitSolve[eqns, {x->x0,y->y0,...}, {x, xmin, xmax}, opts] finds a
numerical solution to the implicit equations eqns for
the functions y, ... with the independent variable x in the range xmin to
xmax. The root {x0,y0,...} should satisfy the equations, or should provide a
good starting point for finding a solution when using FindRoot. Options
which can be supplied with opts include those which can be provided to
FindRoot or NDSolve.";
ImplicitSolve::badroot = "Supplied root is missing value for `1`";
ImplicitSolve::incomplete = "Supplied root is incomplete";
ImplicitSolve::inaccurate = "Supplied root is inaccurate, using FindRoot to
improve accuracy";
"mbekkali" <mbekkali at gmail.com> wrote in message
news:cv6rkr$6hd$1 at smc.vnet.net...
> Hello. I need to plot solutions to system of equations solved using
> numerical functions. I tried:
>
> {f1[(x_)?NumericQ],f2[(x_)?NumericQ]}:={f1,f2}/.FindRoot[{g1[f1,f2,x]==0,g2[f1,f2,x]==0},{f1,0},{f2,0}][[1]]
> Plot[Evaluate[{f1[x],f2[x]},{x,x0,x1}]
>
> where g1,g2 are some functions and x0,x1 some starting variables. I
> get an error message SetDelayed::shape : Lists
> {f1[x_?NumericQ],f2[x_?NumericQ]} and {f1,f2} are not the same shape.
> I suspect that there is something wrong with SetDelayed because using
> Set and Solve plots functions, yet SetDelayed and Solve generates the
> same message as SetDelayed and FindRoot.
>
> I do not understand what is wrong and help file is not useful as it
> does not contain examples with SetDelayed for several variables.
>
> Mukhtar Bekkali
>