EDIT :I change the code of the "calcule_rep_temp()" function...
Hi,
I tried to improve the code... Now the time response is a step response... Comments and criticism are welcome ...
I forgot an important comment... transfer functions must be write without float numbers. F1(X)=1/(1+0.2*X) doesn't works... but F1(X)=1/(1+1/2*X)^2 is ok...
Code:
copie_les_fonctions();
replace_les_fonctions();
place_les_modules();
place_les_phases();
place_les_rep_temp();
calcule_modules();
calcule_phases();
calcule_rep_temp();
Symb();
export liste_fonctions:=MAKELIST(0,X,1,10);
export liste_modules:={};
export liste_phases:={};
export liste_rep_temp:={};
recalc_module:=MAKELIST(1,X,1,10);
recalc_phase:=MAKELIST(1,X,1,10);
recalc_temp:=MAKELIST(1,X,1,10);
modif:=0;
export copie_les_fonctions()
begin
local k;
for k from 1 to 10 do
if ISCHECK(k MOD 10) then
if EVAL(EXPR("F"+k MOD 10)≠liste_fonctions(k)) then
IFERR liste_fonctions(k):=EXPR("F"+k MOD 10) then MSGBOX("Erreur de copie sur F"+k MOD 10) end;
recalc_module(k):=1;
recalc_phase(k):=1;
recalc_temp(k):=1;
end;
end;
end;
modif:=0;
end;
export replace_les_fonctions()
begin
local k;
for k from 1 to length(liste_fonctions) do
if ISCHECK(k MOD 10) then
expr("F"+k MOD 10+":=liste_fonctions("+k+")");
end;
end;
end;
export place_les_modules()
begin
local k;
for k from 1 to length(liste_modules) do
if ISCHECK(k MOD 10) then
expr("F"+k MOD 10+":=liste_modules("+k+")");
end;
end;
end;
export place_les_phases()
begin
local k;
for k from 1 to length(liste_phases) do
if ISCHECK(k MOD 10) then
expr("F"+k MOD 10+":=liste_phases("+k+")");
end;
end;
end;
export place_les_rep_temp()
begin
local k;
for k from 1 to length(liste_rep_temp) do
if ISCHECK(k MOD 10) then
expr("F"+k MOD 10+":=liste_rep_temp("+k+")");
end;
end;
end;
export calcule_modules()
begin
local k;
for k from 1 to length(liste_fonctions) do
if ISCHECK(k MOD 10) AND recalc_module(k) then
liste_modules(k):=20*LOG(ABS(subst(liste_fonctions(k),'X','i*ALOG(X)')));
recalc_module(k):=0;
end;
end;
end;
export calcule_phases()
begin
local k;
for k from 1 to length(liste_fonctions) do
if ISCHECK(k MOD 10) AND recalc_phase(k) then
liste_phases(k):=ARG(subst(liste_fonctions(k),'X','i*ALOG(X)'));
recalc_phase(k):=0;
end;
end;
end;
export calcule_rep_temp()
begin
local f, k;
for k from 1 to length(liste_fonctions) do
if ISCHECK(k MOD 10) AND recalc_temp(k) then
f:=REPLACE(STRING(liste_fonctions(k)),"X","x");
f:=f+"*1/x,x,x";
f:="'("+REPLACE(STRING(CAS.ilaplace(f)),"x","X")+")*PIECEWISE(X<0,0,X≥0,1)'";
IF instring(f,"ilaplace")
THEN MSGBOX("Problème avec F"+k MOD 10); CONTINUE;
ELSE liste_rep_temp(k):=EXPR(f);
END;
recalc_temp(k):=0;
end;
end;
end;
Symb()
begin
modif:=1;
replace_les_fonctions;
STARTVIEW(0,1);
end;
Plot()
begin
local choix;
if modif then copie_les_fonctions end;
CHOOSE(choix,"Choisissez un type de tracé",{"Module","phase","réponse indicielle"});
CASE
IF choix==1 THEN calcule_modules; place_les_modules END;
IF choix==2 THEN calcule_phases; place_les_phases END;
IF choix==3 THEN calcule_rep_temp; place_les_rep_temp; Xmin:=−0.2 END;
//DEFAULT
END;
STARTVIEW(1,1);
end;