# 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 ammónium-nitrátot kell 100,0 g ammónium-szulfáttal
összekeverni, hogy a kapott keverék 24,0 tömegszázalékos legyen
nitrogénre nézve? Ar(H)=1,01, Ar(N)=14,01,  Ar(O)=16,00, Ar(S)=32,07

### Célszerű megoldás

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

kill(all);
eq:(2*ArN/MrNH4NO3*x+2*ArN/MrNH42SO4*100)/(100+x)=0.24;
kill(all);fpprintprec:0;ratprint:true;
ArN:14.01;
MrNH4NO3:4*1.01+2*14.01+3*16;
MrNH42SO4:2*(14.01+4*1.01)+32.07+4*16;
eq:(2*ArN/MrNH4NO3*x+2*ArN/MrNH42SO4*100)/(100+x)=0.24;
solve(eq,x);
float(%[1]);
rhs(%);
sconcat("x=",string(%)," g ammónium-nitrát szükséges.");

### Rövid megoldás

float(rhs(solve((28.02/80.06*x+28.02/132.17*100)/(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. parancsok:
  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. parancs:
  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. parancsok: 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. parancsok:
  ":"  (é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. parancs: 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. parancs: Mik vannak a memóriában?

values;functions;
kill(ArN,pcm);
values;functions;
kill(all);
values;functions;

## Adattípusok

13. parancs: Egész számok, valós számok (konstansokat lásd feljebb).

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

14. parancs: Karaktersorozatok.

"abcdefgh";svariable:%;
charat(svariable,1);
charlist(svariable);
charlist(svariable)[2];
charat(svariable,0);
string("3.1415926*2");
string(3.1415926*2);
sconcat("12","3.4");
sconcat(12,3.4);
kill(svariable)$

15. parancs: Listák (közelítőleg vektorok).

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

16. parancs: 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];

17. parancs: 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

18. parancs: Egy egyszerű példa a fenti jelek megértetéséhez.
20 ml 0,03 M CaCl2 oldatot titrálunk azonos koncentrációjú 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ítani ez utóbbi állítást!)

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

19-25. parancsok: 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 20. 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"]);

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

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

27. 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(%);

28. parancs: 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

29-38. parancsok: Példák a matematikai analízisre.

limit(f(x),x,a);
limit(f(x),x,a,plus);
limit(x/(1+x),x,-inf);

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);

## 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):

draw2d(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)
);