Diskuze: 3D trajektorie
Člen
Zobrazeno 6 zpráv z 6.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
Ahoj,
zkus použít datový typ s větší přesností než má real (třeba extended, nebo double). Mohlo by to pomoci v případě, kdy budou vycházet malá čísla.
Taky sem kdyžtak napiš předpisy těch tří funkcí, které počítáš (pro x, y a z). Jestli čtu ten program dobře, tak jsou předurčeny ke klesání se vzrůstajícím časem t. Kromě činitele exp (který klesá se vzrůstajícím t) se mi zdají ty věci konstantní. Má tomu skutečně tak být?
Děkuji, vlastně jsem tam ještě nezahrnula funkci phi, která je rovněž závislá na čase. Tu tam mám vložit jako funktion nebo zavést další proměnou?
Výpočet funkce phi bych klidně oddělil do samostatné
funkce, která by měla třeba takovouto hlavičku:
{code]
Function Phi(t:Extended):Extended;
[/code]
Jen pak bude třeba předefinovat tvoje aktuální phi na
phi0.
Jelikož tu funkci phi používáš dvakrát, bylo by dobré si její hodnotu pro dané t uložit do proměnné (v každé iteraci cyklu) a následně tuto proměnnou použít při výpočtu jednotlivých omeg, jak vyžaduje předpis. Ale pro tento program to není bezpodmínečné nutné (spíše je to hezké).
program trajektorie;
uses math;
const
nmax = 1000;
I1 = 1;
I2 = 1;
I3 = 3;
O = 1/314;
T0 = 8;
l = 2;
phi0 = 12;
vystup = 1;
soubor = 'trajektorie.dat';
function phi(t:extended):extended;
begin
result:= I3 * (I3-I1)/ (l * I1) * O * cos(T0) * (1 - exp (-l/I3 * t)) + phi0
end;
var
t, x, y, z, dt : extended;
n : integer;
s : text;
begin
case vystup of
2: begin assign(s,soubor); rewrite(s) end;
end;
dt:=pi*2/nmax;
t:=0;
for n:=0 to nmax do begin
t:=t+dt;
x:=O*sin(T0) * exp(-l/I1 * t) * cos(phi(t));
y:=O*sin(T0) * exp(-l/I1 * t) * sin(phi(t));
z:=O*sin(T0) * exp(-l/I3 * t);
case vystup of
1: writeln(x:8:4,y:8:4,z:8:4);
2: writeln(s,x:8:4,y:8:4,z:8:4);
end;
end;
case vystup of
2: begin close(s); writeln('Vytvoren soubor ',soubor,'.') end;
end;
readln;
end.
Jak jsi prosím myslel ten poslední odstavec v minulém příspěvku? Data se stále generují špatně.
Jak jsi prosím myslel ten poslední odstavec v minulém příspěvku? Data se stále generují špatně.
Myslel jsem jej tak, že si založím proměnnou phi_t typu Extended a ten cyklus upravím nějak takto:
for n:=0 to nmax do begin
t:=t+dt;
phi_t := phi(t);
x:=O*sin(T0) * exp(-l/I1 * t) * cos(ph_t);
y:=O*sin(T0) * exp(-l/I1 * t) * sin(phi_t);
z:=O*sin(T0) * exp(-l/I3 * t);
case vystup of
1: writeln(x:8:4,y:8:4,z:8:4);
2: writeln(s,x:8:4,y:8:4,z:8:4);
end;
end;
Výsledek je, že při každé iteraci cyklu se funkce phi počítá jen jednou, ne dvakrát. Ale pro tvoje účely je to jedno.
Jinak mi přijde, že ten kód je, pokud vezmu v potaz ty vzorce nahoře, v pořádku. Někde si tam teda úplně nejsem jistý, kam zasahuje třeba cosinus (např. u vzorce pro phi zda se jedna pouze o cos té thety (nebo co to je ), či zda-li do něj patří i ten další výraz.
Taky mám trošku pochybnosti o konstantě O. Je to skutečně 1/314, nebo má být v nějakém vztahu k číslu pí? Kdyžtak sem zkus hodit (nebo klidně mně do soukromé zprávy, pokud nechceš zveřejňovat) zadání či dalšíí podrobnosti o tom výpočtu (např. odkud se berou konstanty, co se vlastně počítá za věc), aby se to dalo více zkontrolovat.
Zobrazeno 6 zpráv z 6.