Re: NSolve problem
- To: mathgroup at smc.vnet.net
- Subject: [mg59298] Re: [mg59283] NSolve problem
- From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
- Date: Fri, 5 Aug 2005 01:21:26 -0400 (EDT)
- References: <200508040608.CAA26496@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
The message that you get tells you that the matrix is "badly
condition", which means that using MachinePrecision reals is
unreliable and you need to use high precision arithmetic. But, since
your system is actually overdetermined (you have a spurious
equation), even if you increase the precision your equations will
become inconsistent, and you will get an empty set of solutions (but
no message):
Solve[SetPrecision[{2*x + 3*y == 8 + I*7,
3*x + y == 4.99999999999999 + 7*I,
-2*I*x + (1 + 3*I)*y == 3 + 5*I}, 50]]
{}
There are a number of ways to deal with your problem. The most
obvious one is to just use Solve with exact input and only afterwards
apply N
N[Solve[{2*x + 3*y == 8 + I*7, 3*x + y == 5 + 7*I,
-2*I*x + (1 + 3*I)*y == 3 + 5*I}],5]
{{x -> 1.0000 + 2.0000 I, y -> 2.0000 + 1.0000 I}}
Another approach is to simply drop one of the equations:
NSolve[Drop[{2*x + 3*y == 8 + I*7,
3*x + y == 4.99999999999999 + 7*I,
-2*I*x + (1 + 3*I)*y == 3 + 5*I}, -1]]
{{x -> 0.9999999999999958 + 2.*I,
y -> 2.0000000000000027 + 1.*I}}
(Note that I used NSolve this time).
Another possibility, which you could use with a larger number of
variables and equations is to first find a GroebnerBasis for your
system and then solve the resulting new system:
NSolve[GroebnerBasis[{2*x + 3*y == 8 + I*7,
3*x + y == 5 + 7*I, -2*I*x + (1 + 3*I)*y ==
3 + 5*I} /. Equal -> Subtract, {x, y}] == 0,
{x, y}]
{{x -> 1. + 2.*I, y -> 2. + 1.*I}}
Also, note that N[Solve[eqns]] and NSolve[eqns] use different
algorithms and will not always return the same answer.
Also, if you really want 5 digits of precision you have to request it
as above or as in:
N[Solve[GroebnerBasis[{2*x + 3*y == 8 + I*7,
3*x + y == 5 + 7*I, -2*I*x + (1 + 3*I)*y ==
3 + 5*I} /. Equal -> Subtract, {x, y}] == 0,
{x, y}], 5]
{{y -> 2.0000 + 1.0000 I, x -> 1.0000 + 2.0000 I}}
Andrzej Kozlowski
On 4 Aug 2005, at 08:08, Enrique Zeleny wrote:
>
>
> Hi
> I f I try to solve these equations
>
> Solve[{2 x + 3 y == 8 + I 7,
> 3 x + y == 5 + 7 I, -2 I x + (1 + 3 I) y == 3 + 5 I}]
>
> the result is
>
> {{x -> 1 + 2*I, y -> 2 + I}}
>
> but if I have
>
> Solve[{2 x + 3 y == 8 + I 7,
> 3 x + y == 4.99999999999999 + 7 I, -2 I x + (1 + 3 I) y == 3 +
> 5 I}]
>
> gives
>
> \!\(\*FormBox[
> RowBox[{\(RowReduce::"luc"\), \(\(:\)\(\ \)\), "\<\"Result for \
> \\!\\(TraditionalForm\\`RowReduce\\) of badly conditioned matrix \
> \\!\\(TraditionalForm\\`\\((\[NoBreak] \\(\[LeftSkeleton] 1 \
> \[RightSkeleton]\\) \[NoBreak])\\)\\) may contain significant
> numerical \
> errors. \\!\\(\\*ButtonBox[\\\"More\\\",
> ButtonStyle->\\\"RefGuideLinkText\\\
> \", ButtonFrame->None, ButtonData:>\\\"General::luc\\\"]\\)\"\>"}], \
> TraditionalForm]\)
>
>
> {}
>
>
> I need only an aproximate result, say 5 digits of precission, how
> can I
> override the NSolve behavior?
>
>
> Thanks in advance
>
>
- References:
- NSolve problem
- From: Enrique Zeleny <ezeleny@fcfm.buap.mx>
- NSolve problem