HP Forums

Full Version: [BASIC HELP] CAS.fsolve problem [Solved]
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hello,

I'm trying to do a little program to solve an equation but the fsolve returns an error.

Pws(T)
BEGIN
T:=T+273.15;
LOCAL C1,C2,C3,C4,C5,C6,C7;
LOCAL Ps,P;

C1:=-5.6745359*10^3;
C2 := 6.3925247*10;
C3 := −9.6778430/10^(3);
C4 := 6.2215701/10^(7);
C5 := 2.0747825/10^(9);
C6 := −9.4840240/10^(13);
C7 := 4.1635019*10;
Ps:=CAS.fsolve(C1/T+C2+C3*T+C4*T^2+C5*T^3+C6*T^4+C7*ln(T)=ln(P),P,1000);
PRINT("Ps="+Ps);
RETURN Ps;
END;
You have to send CAS commands as a string and then EVAL the string and the variable you are solving for can't be local. Make those two changes and you get:

PHP Code:
EXPORT Pws(T)
BEGIN
 T
:=T+273.15;
 
LOCAL C1,C2,C3,C4,C5,C6,C7;
 
LOCAL Ps;

 
C1:=-5.6745359*10^3;
 
C2 := 6.3925247*10;
 
C3 := −9.6778430/10^(3);
 
C4 := 6.2215701/10^(7);
 
C5 := 2.0747825/10^(9);
 
C6 := −9.4840240/10^(13);
 
C7 := 4.1635019*10;
 
Ps:=CAS.EVAL("fsolve(C1/T+C2+C3*T+C4*T^2+C5*T^3+C6*T^4+C7*ln(T)=ln(P),P,1000)");
 PRINT(
"Ps="+Ps);
 RETURN 
Ps;
END

which returns an answer.


edit: Hmm, it appears you dont' have to EVAL the string because this:

Ps:=CAS("fsolve(C1/T+C2+C3*T+C4*T^2+C5*T^3+C6*T^4+C7*ln(T)=ln(P),P,1000)");

also works.

-road
Either that, or write it as a CAS program to begin with. I started doing the latter for most of my programs, as the back and forth CAS conversions in a regular program just became too cumbersome and error-prone. There may be a downside to that (speed? - - are CAS programs slower than Home programs?), but it sure is convenient!

In your example, you could have perhaps also used FNROOT() without leaving the Home environment.
I see that Road has a workable program, and I was just about to post the same thing. The big issues are:

1. EXPORT the program.
2. T and P are RESERVED variables, so don't make a local variable P.
3. Use a string inside the CAS command.

Here is what I ended up with: Pws(5) ==> 3.45704603787ᴇ119

Code:

EXPORT Pws(T)
BEGIN

  LOCAL C1,C2,C3,C4,C5,C6,C7;
  LOCAL Ps;  //  Omitted Var P, as it is a reserved variable

  T:=T+273.15;  // T is reserved variable also

  C1:=-5.6745359*10^3;
  C2 := 6.3925247*10;
  C3 := −9.6778430/10^(3);
  C4 := 6.2215701/10^(7);
  C5 := 2.0747825/10^(9);
  C6 := −9.4840240/10^(13);
  C7 := 4.1635019*10;

  Ps:=CAS.fsolve("C1/T+C2+C3*T+C4*T^2+C5*T^3+C6*T^4+C7*ln(T)=ln(P),P,1000"); // Note:  Usage of double quotes in CAS command

// PRINT("Ps="+Ps);

  RETURN Ps;
END;
Thank you! This clarifies the things.

(03-22-2019 04:35 PM)DrD Wrote: [ -> ]I see that Road has a workable program, and I was just about to post the same thing. The big issues are:

1. EXPORT the program.
2. T and P are RESERVED variables, so don't make a local variable P.
3. Use a string inside the CAS command.

Here is what I ended up with: Pws(5) ==> 3.45704603787ᴇ119

Code:

EXPORT Pws(T)
BEGIN

  LOCAL C1,C2,C3,C4,C5,C6,C7;
  LOCAL Ps;  //  Omitted Var P, as it is a reserved variable

  T:=T+273.15;  // T is reserved variable also

  C1:=-5.6745359*10^3;
  C2 := 6.3925247*10;
  C3 := −9.6778430/10^(3);
  C4 := 6.2215701/10^(7);
  C5 := 2.0747825/10^(9);
  C6 := −9.4840240/10^(13);
  C7 := 4.1635019*10;

  Ps:=CAS.fsolve("C1/T+C2+C3*T+C4*T^2+C5*T^3+C6*T^4+C7*ln(T)=ln(P),P,1000"); // Note:  Usage of double quotes in CAS command

// PRINT("Ps="+Ps);

  RETURN Ps;
END;
Thank you! You solved my problem. I spent some time trying to make the code work.


(03-22-2019 04:09 PM)roadrunner Wrote: [ -> ]You have to send CAS commands as a string and then EVAL the string and the variable you are solving for can't be local. Make those two changes and you get:

PHP Code:
EXPORT Pws(T)
BEGIN
 T
:=T+273.15;
 
LOCAL C1,C2,C3,C4,C5,C6,C7;
 
LOCAL Ps;

 
C1:=-5.6745359*10^3;
 
C2 := 6.3925247*10;
 
C3 := −9.6778430/10^(3);
 
C4 := 6.2215701/10^(7);
 
C5 := 2.0747825/10^(9);
 
C6 := −9.4840240/10^(13);
 
C7 := 4.1635019*10;
 
Ps:=CAS.EVAL("fsolve(C1/T+C2+C3*T+C4*T^2+C5*T^3+C6*T^4+C7*ln(T)=ln(P),P,1000)");
 PRINT(
"Ps="+Ps);
 RETURN 
Ps;
END

which returns an answer.


edit: Hmm, it appears you dont' have to EVAL the string because this:

Ps:=CAS("fsolve(C1/T+C2+C3*T+C4*T^2+C5*T^3+C6*T^4+C7*ln(T)=ln(P),P,1000)");

also works.

-road
Reference URL's