# Ismerkedés a (wx)Maxima-val

A következő parancs célja, hogy beállítsuk az átmeneti fájlok
tárolására használt könyvtár nevét úgy, hogy az ne tartalmazzon
ékezetes karaktereket. Vigyázat! Ahogy az más, több operációs
rendszeren is futó programoknál szokás, Windows alatt a könyvtárok
neveit elválasztó "\" karaktert "/"-lel vagy "\\"-lel kell
helyettesíteni! Az alábbi parancs változatlan formában csak a
hallgatói kabinet számítógépein működik rendesen.

maxima_tempdir : "C:/Users/Public/MaximaTEMP";

## Bevezető példa

Hány gramm kristályvizes nátrium-tioszulfátot kell 100,00 g vízben oldani,
hogy a nátrium-tioszulfátra nézve 24,00 tömegszázalékos oldatot
kapjunk? Mr(Na2S2O3)=158,11; Mr(H2O)=18,02

### Célszerű megoldás

Játszani az fpprintprec-cel, a ratprint-tel és a ";" <> "$" cserével.

fpprintprec:0;ratprint:true;

Mrwater:18.02;Mrsalt:158.11;Mrwatersalt:Mrsalt+5*Mrwater;
solve((Mrsalt/Mrwatersalt)*x/(100+x)=0.24,x);
float(%[1]);
rhs(%);
sconcat(string(%)," g kristályvizes nátrium-tioszulfát szükséges.");

### Rövid megoldás

float(rhs(solve(158.11/248.21*x/(100+x)=0.24,x)[1]));

## Alapvető műveletek

fpprintprec:6$

### Konvenciók, billentyűzet értelmezése, parancsok,
elválasztó jelek

A Maxima egy ún. CAS (Computer Algebra System) program, alapvetően
parancssoros üzemmódra. A wxMaxima egy grafikus felület a Maximához,
a kettő együtt már nagyon hasonlít a Matematica-hoz.

1-4. parancs(köteg):
  parancskiadás: ENTER és SHIFT-ENTER különbsége,
  sortörés jelentõsége,
  ";" és "$" határolójelek értelme,
  parancsok  és eredmények előtti jelek értelmezése.

1+1;

1+1;2+2;3+3;
4+4;5
+5;

1+1;2+2$3+3;
4+4$5
+5;

10*%;
10*%o1;
%i1;

5. parancsköteg:
  Speciális állandók, valamint a float függvény
    ("%":Ans; "%pi": π=3.14159..., "%e": Euler-szám=2.71828...,
     "%i": imaginárius egység= (-1)^0.5,
     "%i+n": pl. "%i34" a 34. kiadott parancs,
     "%o+n": pl. "%o34" a 34. kiadott parancs eredménye
    )
    /A Maxima csak tizedespontot ismer, tizedesvesszőt nem!/,
  függvények,
  kisbetű/nagybetű érzékenység.

%pi;float(%);%e;float(%e);%i;float(%);
cos(%pi/4);float(%);
cos(%pi/3);float(%);
cos(%Pi/3);Cos(%pi/3);Cos(%Pi/3);

6-7. parancs(köteg): matematikailag pontos eredmény vagy közelítés

1/sqrt(2*%pi);
1.0/sqrt(2*%pi);
1.0/sqrt(2.0*%pi);
1.0/sqrt(2*float(%pi));

(9/7)^87;float(%);

8-10. parancsköteg:
  ":"  (értékadás, szóban mondva 'legyen egyenlő'),
  "="  (egyenlet vagy logikai hasonlítás, szóban mondva 'egyenlő') és
  ":=" (függvény definiálása) jelek használata.

a:3.2;b:1.0;a+b;

a = b;
is(a = b);

pcm(nm):=1.0/(nm/1.0e7);
pcm(500);

11. parancsköteg: Hasznos példa a 10-es alapú logaritmus definiálására.

log(10.0);
lg(x):=log(x)/log(10.0);
lg(10.0);

12. parancsköteg: A "define" kulcsszó használata a ":=" helyett. (többnyire ajánlott!)

expression:integrate(x^3,x);
f0(x):=x^4/4;
f0(2);
f1(x):=expression;
f1(2);
define(f2(x),expression);
f2(2);

13. parancsköteg: Mik vannak a memóriában?

values;functions;
kill(f0,f1,f2,Mrwater,Mrsalt,Mrwatersalt);
values;functions;
kill(all);
values;functions;

## Adattípusok

14. parancsköteg: Egész számok, valós számok (konstansokat lásd feljebb).

3;3.3;float(3);float(3.3);

15. parancsköteg: Karaktersorozatok.

"abcdefgh";svariable:%;
charat(svariable,1);
charlist(svariable);
charlist(svariable)[2];
charat(svariable,0);

16. parancsköteg: Listák (közelítőleg vektorok).

L1:[2,4,6,8,10];
L1[1];L1[3];L1[0];

17. parancsköteg: Mátrixok (közelítőleg lista a listában).

L1:[[1,2],[2,4],[3,6],[4,8],[5,10]];
L1[1];L1[3];
L1[1][2];L1[3][2];

18. parancsköteg: Egyenletek és részeik.

eqs:[x^2=3,exp(-a*x)=2.58];
%[2];
rhs(%);
0.1*%;
0.1*rhs(eqs[2]);

## Egyenletek megoldása

### Egy példa alkalmazásra a "find_root" függvénnyel

19. parancsköteg: Egy egyszerű példa a fenti jelek megértetéséhez.
20 ml 0,03 M CaCl2 oldatot titrálunk 0,03 M Na2SO4 oldattal. Mekkora
fogyásnál válik ki a csapadék, és mekkora fogyásnál oldódik teljesen
vissza? A CaSO4 oldhatósági szorzata Ks=[Ca2+][SO42-]=6,1E-5 M^2.
Megoldás:
Homogén oldatban T(Ca)=20/(20+V)*0,03 és T(SO4)=V/(20+V)*0,03. Ha e
kettő kifejezés szorzata kisebb Ks-nél, akkor homogén a rendszer; ha
nagyobb, akkor csapadék van jelen; egyenlőség esetén csapadékkiválás
vagy csapadékfelodódás van. V=20-nál a legnagyobb a szorzat értéke a
koncentrációk egyenlősége miatt.
(Házi feladat: otthon bizonyítsák be ez utóbbi állítást!)

Ks:6.1e-5$
fnKs(V,V0,c):=V0*V*c^2/(V0+V)^2;
V1:find_root(fnKs(V,20,0.03)=Ks,V,0,20);
V2:find_root(fnKs(V,20,0.03)=Ks,V,20,1000);

20. parancsköteg: Lehet-e ezt pontosabban?

fpprec:50$fpprintprec:50$Ks:6.1e-5$
fnKs(V,V0,c):=V0*V*c^2/(V0+V)^2;
V1:bf_find_root(fnKs(V,20,0.03)=Ks,V,0,20);
V2:bf_find_root(fnKs(V,20,0.03)=Ks,V,20,1000);
float(%pi);
bfloat(%pi);
fpprintprec:6;
V1;V2;

21-27. parancs(köteg): A fenti példában sötét ló: honnan jött az 1000?
(A "tanár mondta" válasz még nem elég!)
/menü a 16. parancsnál/

values;functions;

plot2d([fnKs(V,20,0.03),Ks],[V,0,1000]);

wxplot2d([fnKs(V,20,0.03),Ks],[V,0,1000]);

plot2d([fnKs(V,20,0.03),Ks],[V,0,300]);

plot2d([fnKs(V,20,0.03),Ks],[V,0.1,300],[logx],[ylabel,"fnKs"]);

wxplot2d([fnKs(V,20,0.03),Ks],[V,0.1,300],[logx],[ylabel,"fnKs"]);

plot2d([fnKs(V,20,0.03),fnKs(V,20,0.02),fnKs(V,20,0.015),Ks],
       [V,0.1,300],[logx],[ylabel,"fnKs"]);

### A solve függvény

28. parancs: Példa a solve függvényre. /menüből is/

solve(a*x^2+b*x+c=0,x);

29. parancs: Egy egyszerű hígítási példa. Milyen arányban keverjünk
  15%-os és 45%-os oldatokat, hogy 32%-osat kapjunk?

solve((1*0.15+x*0.45)/(1+x)=0.32,x);float(%);

30. parancsköteg: Kicsit összetettebb oldhatósági példa. Számítsuk ki a
  SrSO4-ra és CaSO4-ra nézve egyidejűleg telített oldatban a
  Sr2+, Ca2+ és a SO42- ionok egyensúlyi koncentrációját!
  L(SrSO4)=1,18E-6 M^2 és L(CaSO4)=6,10E-6 M^2 (tizedesjel!!). 

egyenletek:[1.18e-6=Sr*SO4,6.10e-6=Ca*SO4,Sr+Ca=SO4];
solve(egyenletek,[Sr,Ca,SO4]);
float(%);
float(%[1]);

## Szimbolikus matematika

31-40. parancs(köteg): Példák a matematikai analízisre.

limit(f(x),x,a);
limit(f(x),x,a,plus);
limit(f(x),x,a,minus);

wxplot2d(1/x,[x,-3,3],[y,-10,10]);
limit(1/x,x,0);
limit(1/x,x,0,plus);
limit(1/x,x,0,minus);

diff(f(x),x);
diff(V(p),p);

diff(x^n,x);
diff(%e^x,x);

taylor(%e^x,x,0,5);

integrate(f(x),x);
integrate(V(p),p);

integrate(1/x,x);

integrate(1/x,x,1,2);

integrate(t^2,t);

integrate(t^2,t,0,1);float(%);
romberg(t^2,t,0,1);

41-42. parancsköteg: A kinetika előadás egyik részlete.
  Vezessük le az elsőrendű kinetikát követő reakcióban a reaktáns
  koncentrációjának időfüggését megadó egyenletet!

integrate(1/a,a,a0,at)=integrate(-k,tau,0,t);
solve(%,at);

assume(at>0)$assume(a0>at)$assume(t>0)$
integrate(1/a,a,a0,at)=integrate(-k,tau,0,t);
solve(%,at);

## Kétdimenziós ábrák készítése

A
http://www.austromath.at/daten/maxima/zusatz/Graphics_with_Maxima.pdf
leírás mindkét (plot és draw) csomagot nagyon jól bemutatja

### Plot csomag: a (wx)plot2d parancsok

Cél: A (wx)plot2d parancsok paramétereinek bemutatása lépésenként,
az exponenciális és négyzetgyök függvény együttes ábrázolásával.

Minimális parancs (csak egy függvény):

wxplot2d(exp(x)-1,
  [x,0.001,1]
);

Minimális parancs (csak egy függvény) más aránnyal:

wxplot2d(exp(x)-1,
  [x,0.001,1],
  [yx_ratio,0.5]
);

Kettő függvény (szögletes zárójelben, vesszővel elválasztva):

wxplot2d([exp(x)-1,sqrt(x)],
  [x,0.001,1],
  [yx_ratio,0.5]
);

Y-tengely beállítása:

wxplot2d([exp(x)-1,sqrt(x)],
  [x,0.001,1],[y,0,2],
  [yx_ratio,0.5]
);

Rácsozat:

wxplot2d([exp(x)-1,sqrt(x)],
  [x,0.001,1],[y,0,2],
  [yx_ratio,0.5],
  grid2d
);

Tengelycímek:

wxplot2d([exp(x)-1,sqrt(x)],
  [x,0.001,1],[y,0,2],
  [yx_ratio,0.5],
  grid2d,
  [xlabel,"X-tengely"],[ylabel,"Y-tengely"]
);

Tengelyfeliratok:

wxplot2d([exp(x)-1,sqrt(x)],
  [x,0.001,1],[y,0,2],
  [yx_ratio,0.5],
  grid2d,
  [xlabel,"X-tengely"],[ylabel,"Y-tengely"],
  [xtics,0.2,0.2,1.0],[ytics,0.0,0.2,2.0]
);

Színváltozás:

wxplot2d([exp(x)-1,sqrt(x)],
  [x,0.001,1],[y,0,2],
  [yx_ratio,0.5],
  grid2d,
  [xlabel,"X-tengely"],[ylabel,"Y-tengely"],
  [xtics,0.2,0.2,1.0],[ytics,0.0,0.2,2.0],
  [color,red,"#00ff00"]
);

Adatsor ábrázolni:

adatsor:[
  [0.1,0.2],
  [0.2,0.39],
  [0.3,0.62],
  [0.4,0.802],
  [0.5,0.97],
  [0.6,1.2],
  [0.7,1.39],
  [0.8,1.62]
];

Adatsort rátenni az ábrára, majd változtatni a stílusokat:

wxplot2d([exp(x)-1,sqrt(x),[discrete,adatsor]],
  [x,0.001,1],[y,0,2],
  [yx_ratio,0.5],
  grid2d,
  [xlabel,"X-tengely"],[ylabel,"Y-tengely"],
  [xtics,0.2,0.2,1.0],[ytics,0.0,0.2,2.0],
  [color,red,"#00ff00",blue,black],
  [point_type,bullet],
  [style,[lines,2.0],[lines,1.0],[linespoints,2,3,blue,bullet]]
);

Változtatni a jelmagyarázatot:

wxplot2d([exp(x)-1,sqrt(x),[discrete,adatsor]],
  [x,0.001,1],[y,0,2],
  [yx_ratio,0.5],
  grid2d,
  [xlabel,"X-tengely"],[ylabel,"Y-tengely"],
  [xtics,0.2,0.2,1.0],[ytics,0.0,0.2,2.0],
  [color,red,"#00ff00",blue,black],
  [point_type,bullet],
  [style,[lines,2.0],[lines,1.0],
    [linespoints,2,3,blue,bullet]],
  [legend,"exp(x)","sqrt(x)","adatsor","adatsor"],
  [gnuplot_preamble,"set key top left"]
);

Logaritmikus X-tengely:

wxplot2d([exp(x)-1,sqrt(x),[discrete,adatsor]],
  [x,0.001,1],[y,0,2],logx,
  [yx_ratio,0.5],
  grid2d,
  [xlabel,"logaritmikus X-tengely"],[ylabel,"Y-tengely"],
  [xtics,0.2,0.2,1.0],[ytics,0.0,0.2,2.0],
  [color,red,"#00ff00",blue,black],
  [point_type,bullet],
  [style,[lines,2.0],[lines,1.0],
    [linespoints,2,3,blue,bullet]],
  [legend,"exp(x)","sqrt(x)","adatsor","adatsor"],
  [gnuplot_preamble,"set key top left"]
);

### Draw csomag: a (wx)draw2d parancsok

A "draw" rajzoló csomag használata (sokak szerint) bonyolultabb,
mint a plot-é, de (sokak szerint) szebb ábrákat készít.

Cél: A (wx)draw2d parancsok paramétereinek bemutatása lépésenként,
az exponenciális és négyzetgyök függvény együttes ábrázolásával.

(Néha) kell a következő parancs:

load(draw);

Minimális parancs (csak egy függvény):

wxdraw2d(explicit(exp(x)-1,x,0.001,1));

Minimális parancs (csak egy függvény) más aránnyal:

wxdraw2d(
  user_preamble = "set size ratio 0.5",
  explicit(exp(x)-1,x,0.001,1)
);

Kettő függvény (szögletes zárójelben, vesszővel elválasztva):

wxdraw2d(
  user_preamble = "set size ratio 0.5",
  color = blue,
  key = "%e^x-1",
  explicit(exp(x)-1,x,0.001,1),
  color = red,
  key = "sqrt(x)",
  explicit(sqrt(x),x,0.001,1)
);

Y-tengely beállítása:

wxdraw2d(yrange = [0,2],
  user_preamble = "set size ratio 0.5",
  color = blue,
  key = "%e^x-1",
  explicit(exp(x)-1,x,0.001,1),
  color = red,
  key = "sqrt(x)",
  explicit(sqrt(x),x,0.001,1)
);

Rácsozat:

wxdraw2d(
  user_preamble = "set size ratio 0.5",
  grid = true,
  yrange = [0,2],
  color = blue,
  key = "%e^x-1",
  explicit(exp(x)-1,x,0.001,1),
  color = red,
  key = "sqrt(x)",
  explicit(sqrt(x),x,0.001,1)
);

Tengelycímek:

wxdraw2d(
  user_preamble = "set size ratio 0.5",
  grid = true,
  yrange = [0,2],
  xlabel = "X-tengely",
  ylabel = "Y-tengely",
  color = blue,
  key = "%e^x-1",
  explicit(exp(x)-1,x,0.001,1),
  color = red,
  key = "sqrt(x)",
  explicit(sqrt(x),x,0.001,1)
);

Tengelyfeliratok:

wxdraw2d(
  user_preamble = "set size ratio 0.5",
  grid = true,
  yrange = [0,2],
  xlabel = "X-tengely",
  ylabel = "Y-tengely",
  xtics = {0.2,0.4,0.6,0.8,1.0},
  ytics = {0,0.2,0.4,0.6,0.8,1.0,1.2,1.4,1.6,1.8,2.0},
  color = blue,
  key = "%e^x-1",
  explicit(exp(x)-1,x,0.001,1),
  color = red,
  key = "sqrt(x)",
  explicit(sqrt(x),x,0.001,1)
);

Színváltozás:

wxdraw2d(
  user_preamble = "set size ratio 0.5",
  grid = true,
  yrange = [0,2],
  xlabel = "X-tengely",
  ylabel = "Y-tengely",
  xtics = {0.2,0.4,0.6,0.8,1.0},
  ytics = {0,0.2,0.4,0.6,0.8,1.0,1.2,1.4,1.6,1.8,2.0},
  color = red,
  key = "%e^x-1",
  explicit(exp(x)-1,x,0.001,1),
  color = green,
  key = "sqrt(x)",
  explicit(sqrt(x),x,0.001,1)
);

Adatsor ábrázolni:

adatsor:[
  [0.1,0.2],
  [0.2,0.39],
  [0.3,0.62],
  [0.4,0.802],
  [0.5,0.97],
  [0.6,1.2],
  [0.7,1.39],
  [0.8,1.62]
];

Adatsort rátenni az ábrára, majd változtatni a stílusokat:

wxdraw2d(
  user_preamble = "set size ratio 0.5",
  grid = true,
  yrange = [0,2],
  xlabel = "X-tengely",
  ylabel = "Y-tengely",
  xtics = {0.2,0.4,0.6,0.8,1.0},
  ytics = {0,0.2,0.4,0.6,0.8,1.0,1.2,1.4,1.6,1.8,2.0},
  color = red,
  key = "%e^x-1",
  explicit(exp(x)-1,x,0.001,1),
  color = green,
  key = "sqrt(x)",
  explicit(sqrt(x),x,0.001,1),
  color = blue,
  key = "disrete3",
  point_type = filled_circle,
  point_size = 1.5,
  points_joined = true,
  line_type = solid,
  line_width = 2,
  points(adatsor)
);

Változtatni a jelmagyarázatot:

wxdraw2d(
  user_preamble = "set key top left; set size ratio 0.5",
  grid = true,
  yrange = [0,2],
  xlabel = "X-tengely",
  ylabel = "Y-tengely",
  xtics = {0.2,0.4,0.6,0.8,1.0},
  ytics = {0,0.2,0.4,0.6,0.8,1.0,1.2,1.4,1.6,1.8,2.0},
  color = red,
  key = "exp(x)",
  explicit(exp(x)-1,x,0.001,1),
  color = green,
  key = "sqrt(x)",
  explicit(sqrt(x),x,0.001,1),
  color = blue,
  key = "adatsor",
  point_type = filled_circle,
  point_size = 1.5,
  points_joined = true,
  line_type = solid,
  line_width = 2,
  points(adatsor)
);

Logaritmikus X-tengely:

wxdraw2d(
  user_preamble = "set key top left; set size ratio 0.5",
  grid = true,
  yrange = [0,2],
  xlabel = "X-tengely",
  ylabel = "Y-tengely",
  xtics = {0.2,0.4,0.6,1.0},
  ytics = {0,0.2,0.4,0.6,0.8,1.0,1.2,1.4,1.6,1.8,2.0},
  logx = true,
  color = red,
  key = "exp(x)",
  explicit(exp(x)-1,x,0.001,1),
  color = green,
  key = "sqrt(x)",
  explicit(sqrt(x),x,0.001,1),
  color = blue,
  key = "adatsor",
  point_type = filled_circle,
  point_size = 1.5,
  points_joined = true,
  line_type = solid,
  line_width = 2,
  points(adatsor)
);