Tulipa eteen yksinkertainen ongelma johon ei löytynyt
ratkaisua.
Piti Matalbilla ratkaista kuvaajan
(typpiä Ys=K*Omega^2/(s^2+2*Ze*Omega*s+Omega^2*s)
maksimiarvo ja ajanhetki jolloin ko. arvo esiintyy.
MatLab derivointi sanoo sitkeästi että kun t=0
niin derivaatta ko. yhtälöstä on nolla.
Miten Matlabissa saa derivaatan *kaikki* nollakohdat esille?
Kun laitoin funktion fzero() komennon parametriksi niin sain
laitettua alkuarvon nollakohdan laskennalle ja siitä oikean
nollakohdan selville.
Puutuuko Matlabista tosiaan funktio joka antaisi tuloksena
vektorissa lähtöfunktion kaikki nollakohdat?
Tuo tuntuu niin perusjutulta että kumma juttu?
Onnistuisiko funktion nollakohtien ratkaisu symbolisella
laskennalla?
MATLAB onnistuu kyllä löytämään kaikki funktion nollakohdat, mutta vain
polynomeista (>> help roots). Ja sekin tuntuu olevan numeerisesti
ailahtelevainen, kun olen kokeillut 2-kanavaisen suodatinpankin
suunnittelua valitsemalla juuria pareittain z-tason kuvaajasta. Mutta ei
nyt siitä sen enempää. Universaalista nollakohtien haarukoinnista en mene
sanomaan mitään muuta kuin, että kannattaisi etsiä netistä josko sieltä
löytyisi numeerisia menetelmiä, jotka ovat rajoittuneet tietyntyyppisiin
erikoistapauksiin.
Ja jos haluat automatisoida symbolisen laskennan keinoin kuvaamasi
tyyppiset ongelmat, niin GNU-lisenssillä löytyy MAXIMA. Sille voi myös
ohjata batch-moodissa syötteen ja valita tuloksen kirjoittamisen
tiedostoon. En ole varma haitko juuri tätä?
(%i1) Ys:K*w^2/(s^2+2*Ze*w*s+w^2*s);
(%o1) ...
(%i2) dYds=diff(Ys,s);
Ohjelmiston kotisivut:
http://maxima.sourceforge.net/
-juuso
Jos haluat käyttää Matlabia symboliseen laskentaan, niin tarvit Symbolic
Math Toolboxin, joka käyttää Maplen kerneliä laskujen suorittamiseen.
Sillä saat esim. nuo derivaatan nollakohdat jotenkin näin:
syms s
solve('diff(lauseke) = 0','s')
Jos taas ihan numeerinen vastaus kelpaa ja sulla on Ys:n ja s:n arvot
vektoreissa, niin maksimikohdan ja -arvon saat toki yksinkertaisesti
komennoilla
[maxArvo indeksi] = max(Ys);
maxKohta = s(indeksi);
Juu tein tuon sitten tyyliin :
% Lasketaan vasteen arvot vektoriin ajalle 1us - 100us :
arvot=subs(gt, 1e-6:1e-6:1e-4);
% Etsitään maksimiarvo ja ajankohta vektorista :
[MaxArvo Maxtime] = max(arvot);
Pitänee tutustua myös Maximaan, mutta vasta ensi syksynä..
Kiitos.