Re: Problems with Solve

• To: mathgroup at smc.vnet.net
• Subject: [mg132466] Re: Problems with Solve
• From: Bill Rowe <readnews at sbcglobal.net>
• Date: Sun, 23 Mar 2014 04:59:58 -0400 (EDT)
• Delivered-to: l-mathgroup@mail-archive0.wolfram.com
• Delivered-to: l-mathgroup@wolfram.com
• Delivered-to: mathgroup-outx@smc.vnet.net
• Delivered-to: mathgroup-newsendx@smc.vnet.net

```On 3/22/14 at 12:06 AM, sy81 at sussex.ac.uk (Samuel Mark Young) wrote:

>Hello everyone, I'm trying to use the solutions of Solve from
>solving a cubic equation - however, it keeps returning complex
>answers when there are real solutions. For example:

>Solve[z + 5 (z^2 - 1) + 1 z^3 == 1, z]

>This equation has 3 real solutions. However, the answers returned
>when I ask mathematica for a decimal answer are complex (which I
>need to do later on when an integration needs solving numerically):
>{{z -> 0.925423 + 0. I}, {z -> -4.47735 +
>2.22045*10^-16 I}, {z -> -1.44807 - 4.44089*10^-16 I}}

Since the equation you provided Solve has exact coefficients you
must have done

Solve[z + 5 (z^2 - 1) + 1 z^3 == 1, z] // N

to get the result you posted

>I'm guessing this is to do with the finite precision that is used in
>the calculations as the imaginary components are very small, but am
>unsure how to deal with them and they shouldn't be there. Any
>suggestions?

Use Chop to get rid of small values, i.e.,

In[8]:= Solve[z + 5 (z^2 - 1) + 1 z^3 == 1, z] // N // Chop

Out[8]= {{z->0.925423},{z->-4.47735},{z->-1.44807}}

Or perhaps even better when you want machine precision answers
use NSolve

In[9]:= NSolve[z + 5 (z^2 - 1) + 1 z^3 == 1, z]

Out[9]= {{z->-4.47735},{z->-1.44807},{z->0.925423}}

>The second problem I am having is that I need to solve for s in a
>function B[s] == 10^-5, where B is some (complicated) function of s.

>The form of the function depends on s - and this is handled by If[]
>commands in the function B. For example, the s dependance might be:

>B[s]:=If[s<0.5,Erfc[-x],Erfc[-x]+Erfc[y]-Erfc[z]]

>B[s] is a smooth function of s.

>The problem seems to arise because, before it has found a solution for
>s, it can't decide which form of the function to use - and so just
>returns an error message

You can ensure your function won't evaluate with symbolic
arguments by defining it as:

B[s_?NumericQ]:

Another thing to consider :

It is generally not good to use a single capital letter for
things you define in Mathematica. Doing so can lead to conflicts
since there are with built-in definitions for several capital letters.

However, I suspect none of the above will work. The problem is s
is not a really parameter of what is being computed. Instead it
is being used as a switch.

If you were to do

=46indRoot[b[s]-10^5, {s, ...

B[s] cannot return numeric values unless x, y and z have defined
numeric values. And if they do have defined numeric values, B[s]
will return a constant value for all s < .5 and another constant
value when s >= .5.

I would guess you really want to do something like

b[s_,res_?NumericQ]:=If[s<.5, FindRoot[Erfc[x]-res,{x ....

```

• Prev by Date: Re: Problems with Solve
• Next by Date: Re: Mapping tag-value lists to a third
• Previous by thread: Re: Problems with Solve
• Next by thread: Re: Problems with Solve