NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Tereza Burbová:27.12.2017 21:11

Ahoj, mohl by mi prosím někdo poradit, jak vykreslit 3D trajektrorii. Mám zadané tři funkce. Trošku umím v gnuplotu, ale je jedno v čem, pokusím se to případně naučit. Zkoušela jsem v pascalu naprogramovat soubor s daty (že to pak dám do gnuplotu), ale je to špatně - x, y jsou samé nuly a z ze začátku velmi malá čísla, pak také nuly. Nejsem si také jistá s počátečníma podmínkama.

program trajektorie;
uses math;
const
  nmax = 1000;
  I1 = 1;
  I2 = 1;
  I3 = 3;
  O = 1/314;
  T0 = 8;
  l = 2;
  phi = 0.2;
  vystup = 1;
  soubor = 'trajektorie.dat';
var
  t, x, y, z, dt : real;
  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);
    y:=O*sin(T0) * exp(-l/I1 * t) * sin(phi);
    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.

Děkuji

 
Odpovědět
27.12.2017 21:11
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Tereza Burbová
Martin Dráb:27.12.2017 21:26

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?

Nahoru Odpovědět
27.12.2017 21:26
2 + 2 = 5 for extremely large values of 2
Avatar
Tereza Burbová:27.12.2017 22:11

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?

 
Nahoru Odpovědět
27.12.2017 22:11
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Tereza Burbová
Martin Dráb:27.12.2017 23:03

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):Ex­tended;
[/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é).

Nahoru Odpovědět
27.12.2017 23:03
2 + 2 = 5 for extremely large values of 2
Avatar
Tereza Burbová:28.12.2017 9:00
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ě.

Editováno 28.12.2017 9:02
 
Nahoru Odpovědět
28.12.2017 9:00
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Tereza Burbová
Martin Dráb:28.12.2017 13:59

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 ? 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.

Editováno 28.12.2017 13:59
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
28.12.2017 13:59
2 + 2 = 5 for extremely large values of 2
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.