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