Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Solve::ivar: 0 is not a valid variable.

1,296 views
Skip to first unread message

Ding Yuan

unread,
Dec 13, 2012, 4:07:50 AM12/13/12
to
Hello,

I am fresh in Mathematica. Can anyone explain what is happening in this code?

Cheers

Ding


------------
gamma = 1.5; m = 0;
C0 = 1.; CA = 2;
CF = (C0^2 + CA^2)^0.5; CT = (C0 CA)/CF;
Ce = 0.5; CAe = 5 ;
CFe = (Ce^2 + CAe^2)^0.5; CTe = (Ce CAe)/CFe;
delta = (2 C0^2 + gamma CA^2)/(2 Ce^2 + gamma CAe^2);
kza = 1.;
k0[x_] := (-(((x^2 - C0^2) (x^2 - CA^2) )/((C0^2 + CA^2) (x^2 -
CT^2))))^0.5
ke[x_] := (-(((x^2 - Ce^2) (x^2 - CAe^2))/((Ce^2 + CAe^2) (x^2 -
CTe^2))))^0.5
NSolve[(delta (x^2 - CAe^2) k0[x] BesselI[m + 1, k0[x] kza])/
BesselI[m,
k0[x] kza] + ((x^2 - CA^2) ke[x] BesselK[m + 1, ke[x] kza])/
BesselK[m, ke[x] kza] == 0, {x, 0, 10}, Reals]

NSolve::ivar: 0 is not a valid variable. >>
NSolve[(0.0941502 (-25 +
x^2) (-(((-4 + x^2) (-1. + x^2))/(-0.8 + x^2)))^0.5 BesselI[1,
0.447214 (-(((-4 + x^2) (-1. + x^2))/(-0.8 + x^2)))^0.5])/
BesselI[0,
0.447214 (-(((-4 + x^2) (-1. + x^2))/(-0.8 + x^2)))^0.5] + (
0.199007 (-4 +
x^2) (-(((-25 + x^2) (-0.25 + x^2))/(-0.247525 +
x^2)))^0.5 BesselK[1,
0.199007 (-(((-25 + x^2) (-0.25 + x^2))/(-0.247525 +
x^2)))^0.5])/
BesselK[0,
0.199007 (-(((-25 + x^2) (-0.25 + x^2))/(-0.247525 +
x^2)))^0.5] == 0, {x, 0, 10}, Reals]

daniel.l...@gmail.com

unread,
Dec 14, 2012, 2:58:53 AM12/14/12
to
(1) Look at the documentation bfor NSolve. It does not support ranges for variables in the way you had thought. Moreover the error message is quite informative here-- it is telling you that 0 was being passed as a "variable".

(2) it can be done as below, adding an explicit inequality to demarcate the range of the variable. This works, albeit it takes a bit of time (might have been a minute or so).

NSolve[{(delta (x^2 - CAe^2) k0[x] BesselI[m + 1, k0[x] kza])/
BesselI[m,
k0[x] kza] + ((x^2 - CA^2) ke[x] BesselK[m + 1, ke[x] kza])/
BesselK[m, ke[x] kza] == 0, 0 <= x <= 10}, x, Reals]

During evaluation of In[156]:= Solve::ratnz: Solve was unable to solve the system with inexact coefficients. The answer was obtained by solving a corresponding exact system and numericizing the result. >>

Out[165]= {{x -> 0.898603}, {x -> 0.928239}}

(3) See (1). One should always check docs before sending up a flare to a mailing list.

Daniel Lichtblau
Wolfram Research

Bob Hanlon

unread,
Dec 14, 2012, 2:58:59 AM12/14/12
to
Use exact values until the last moment to enable simplifications when possible.

gamma = 3/2;
m = 0;
C0 = 1;
CA = 2;
CF = Sqrt[C0^2 + CA^2];
CT = (C0 CA)/CF;
Ce = 1/2;
CAe = 5;
CFe = Sqrt[Ce^2 + CAe^2];
CTe = (Ce CAe)/CFe;
delta = (2 C0^2 + gamma CA^2)/(2 Ce^2 + gamma CAe^2);
kza = 1;

When using numeric techniques your function definitions should be
restricted to numeric arguments.

k0[x_?NumericQ] :=
Sqrt[-(((x^2 - C0^2) (x^2 - CA^2))/((C0^2 + CA^2) (x^2 - CT^2)))]

ke[x_?NumericQ] :=
Sqrt[-(((x^2 - Ce^2) (x^2 - CAe^2))/((Ce^2 + CAe^2) (x^2 - CTe^2)))]

You used the wrong syntax for NSolve

NSolve[(delta*(x^2 - CAe^2)*
k0[x]*BesselI[m + 1,
k0[x]*kza])/BesselI[m,
k0[x]*kza] +
((x^2 - CA^2)*ke[x]*
BesselK[m + 1, ke[x]*
kza])/BesselK[m,
ke[x]*kza] == 0, x, Reals]

NSolve::nsmet:This system cannot be solved with the methods available
to NSolve. >>

NSolve[
(4*(-25 + x^2)*BesselI[1,
k0[x]]*k0[x])/
(19*BesselI[0, k0[x]]) +
((-4 + x^2)*BesselK[1,
ke[x]]*ke[x])/BesselK[0,
ke[x]] == 0, x, Reals]

When NSolve cannot be used, use FindRoot but you will need estimates
of the roots. Plotting the function can help with this:

Plot[(delta (x^2 - CAe^2) k0[x] BesselI[m + 1, k0[x] kza])/
BesselI[m,
k0[x] kza] + ((x^2 - CA^2) ke[x] BesselK[m + 1, ke[x] kza])/
BesselK[m, ke[x] kza], {x, -5.1, 5.1}, PlotRange -> {-20, 20}]

Plot[(delta (x^2 - CAe^2) k0[x] BesselI[m + 1, k0[x] kza])/
BesselI[m,
k0[x] kza] + ((x^2 - CA^2) ke[x] BesselK[m + 1, ke[x] kza])/
BesselK[m, ke[x] kza], {x, 0.89, 0.94}]

FindRoot[(delta (x^2 - CAe^2) k0[x] BesselI[m + 1, k0[x] kza])/
BesselI[m,
k0[x] kza] + ((x^2 - CA^2) ke[x] BesselK[m + 1, ke[x] kza])/
BesselK[m, ke[x] kza] == 0, {x, #}] & /@
Flatten[{-1.9, -0.93, -0.904, Range[-.897, -.894, .001],
Range[.894, .897, .001], .904, .93, 1.9}] // Chop

{{x -> -2.}, {x -> -0.928239}, {x -> -0.898603}, {x -> -0.898603}, {x \
-> -0.895811}, {x -> -0.895102}, {x ->
0.928239}, {x -> -0.928239}, {x -> 0.895102}, {x ->
0.895811}, {x -> 0.898603}, {x -> 0.898603}, {x -> 0.928239}, {x ->
2.}}

The Chop is necessary to remove small imaginary artifacts arising from
the numerical techniques.

These are not all of the roots since the function is highly
oscillatory in some ranges.


Bob Hanlon
0 new messages