Program rysuje dwu- i trójwymiarowe trajektorie punktów. Rysowane są trajektorie trzech typów:
- trajektorie uładów dynamicznych
- krzywe opisane parametrycznie
- ciągi
Trajektorie można wybrać z pewnej listy.
Lista ta tworzona jest następująco:
- Wpierw tworzona jest lista katalogów, zawiera ona:
- katalog_zawierający_program/resources
- katalog_danych_aplikacji/bs/trajectories
wyjątkowo (gdy podczas pierwszej próby zapisania podkatalog bs/trajectories nie istniał) będzie to
katalog_danych_aplikacji
- katalogi wymienione w pliku resources/Directories.data
Katalog_danych_aplikacji jest opisany w zmiennej środowiskowej APPDATA. W systemach Windows 7 i Windows 10 jest to katalog:
C:\Users\nazwa_użytkownika\AppData\Roaming.
- Każdy analizowany katalog musi zawierać pliku Systems.xml
- Plik Systems.xml musi zawierać sekcje opisujące trajektorie (wzór opisu)
- Klasa obliczająca (plik ⋅.class) musi się znajdować obok pliku Systems.xml (przykładowa klasa)
Zastosowany algorytm
- Trajektoria ukladu dynamicznego
Trajektoria składa się z punktów Pi = (x(i⋅h); y(i⋅h)) lub Pi = (x(i⋅h); y(i⋅h); z(i⋅h) 0 ≤ i < n.
Wartość zmiennej n jest ustalana przez użytkownika w polu Liczba iteracji, a wartość zmiennej h w polu Krok.
Punkt początkowy P0 rysowany jest kolorem niebieskim.
Współrzędne punktu P0 ustalane są przez użytkownika w polach: Początkowa wartość x, Początkowa wartość y Początkowa wartość z.
Współrzędne kolejnych punktów Pi wyliczane są rekurencyjnie,
z twierdzenia o wartości średniej wynika że, x((i+1)⋅h) = x(i⋅h) + x'(ci)⋅h, ci
należy do przedziału [i⋅h; (i+1)⋅h]. Program oblicza tak: x((i+1)⋅h) = x'(i⋅h)⋅h tzn.
przyjmuje, że ci = i⋅h.
- Krzywa parametryczna
Kolejne punkty (wyrazy ciągu) obliczane są ze wzoru Pn = (x(tn); y(tn)) lub Pn = (x(tn); y(tn); z(tn)).
Użytkownik może wybrać liczbę punktów (pole Liczba iteracji), różnicę tn+1 - tn (pole Krok)
i wartość t0 (pole Początkowa wartość t).
- Ciąg
Kolejne punkty (wyrazy ciągu) obliczane są ze wzoru. Liczbę wyrazów ustala użytkownik w polu Liczba iteracji.
Domyślnie program rysuje tylko obliczone punkty. Klikanie prawym przyciskiem myszy w obszar rysunku zmienia cyklicznie zasadę rysowania:
- dwa kolejne punkty łączone są odcinkiem
- nic nie jest rysowane
- rysowane są tylko punkty
- ...
Przykładowy plik Systems.xml
Pliki Systems.xml można edytować programem.
<?xml version="1.0" encoding="ISO-8859-2"?>
<Systems>
<System>
<Name>Atraktor Lorentza</Name>
<Class>Lorentz</Class>
<Html-Description><![CDATA[x' = sy - sx y' = -xz + rx - y z' = xy - bz]]></Html-Description>
<Starting-Point>1.0;0.0;1.0</Starting-Point>
<Iterations>10000</Iterations>
<Step>0.01</Step>
<Parameters>r=28;s=10;b=2.33333333</Parameters>
<Dimension>3</Dimension>
</System>
</Systems>
Znacznik Name to nazwa systemu, która zostanie wyświetlona na liście systemów do wyboru.
Znacznik Class to nazwa klasy.
Znacznik Html-Description to tekst, który zostanie wyświetlony pod wykresem.
Przykładowy kod klasy
import java.util.ArrayList;
import bs.math.trajectories.DynamicalSystem;
public class Elipse implements DynamicalSystem
{
public double[] compute(double step, ArrayList args, ArrayList params)
{
double a = -0.9;
double b = 0.8;
if(params.size() > 1)
{
b = params.get(1);
}
if(params.size() > 0)
{
a = params.get(0);
}
double x = args.get(0);
double y = args.get(1);
double old_x = x;
x += a⋅y⋅step;
y += b⋅old_x⋅step;
double result[] = {x, y};
return result;
}
}
Kod interfejsu DynamicalSystem
package bs.math.trajectories;
import java.util.ArrayList;
public interface DynamicalSystem
{
public double[] compute(double step, ArrayList args, ArrayList params);
}