Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.
Nástěnka
❗22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
❗04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
❗23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.
Nejste přihlášen(a). Přihlásit

Ahoj,
potřeboval bych v Matlabu pracovat s matematickými funkcemi, které se v programu vícekrát opakují. Zkoušel jsem je uchovat jako string:
f1='x^2+3*y'; x=2; y=3; vysledek=eval(f1);
jenže se neúnosně zpomalí výpočet, myšleno oproti
x=2; y=3; vysledek=x^2+3*y;
To zpomalení je řádově desetinásobné, což je pro mě nepoužitelné. Ještě o něco pomalejší je práce se symbolickými proměnnými:
syms xs ys;
x=2;
y=3;
f1=xs^2+3*ys;
vysledek=subs(f1,{xs,ys},{x,y})Víte někdo o způsobu, jak se vyhnout ručnímu přepisování všech matematických funkcí použitých v kódu? Mohl bych ke každé matematické funkci vytvořit odpovídající programátorskou funkci, ale to je (alespoň v Matlabu) dost nepohodlné, protože by každá potřebovala vlastní .m soubor. Předem díky:)
EDIT: Jenom pro upřesnění, i když je to asi jasné - chtěl bych na začátku kódu definovat nějakou mat. funkci (popř. ji načíst od uživatele) a dále ji používat bez úprav dalších částí kódu.
Offline
↑ FliegenderZirkus:
ja by som to riesil cez m-subor. ta nepohodlnost je skor subjektivna. proste funkcie sa robia v matlabe ako m-subory.
este mas moznost vytvorit si anonymnu funkciu. na tu nepotrebujes m-subor.
nazyva sa sice "anonymna" hoci je jasne, ze musi mat vlastne meno.
napr:
my_func = @(x, y) x.^2 - y.^2;
volanie funkcie
my_func(x, y)
Offline

↑ etchie:
To se mi líbí, dík za tip.
Zkusím ještě doplnit kontext: na začátku mám dvě funkce dvou proměnných f1(x,y) a f2(x,y) a v kódu pracuji s těmito funkcemi a s maticí jejich parciálních derivací (Jakobiánem). V tuto chvíli mám všech šest funkcí (f1,f2 a čtyři parcální derivace) uložené v jednotlivých .m souborech, které musím vždy při změně vstupu ručně editovat. Pokud bych ale ty funkce měl uložené symbolicky, tak ten Jakobián Matlab spočítá sám. Na vstupu jsou pak potřeba jen ony dvě funkce místo nynějších šesti. Problém je ale, jak už jsem napsal, v rychlosti.
Ideální by tedy bylo načíst funkce f1, f2 symbolicky, nechat Matlab spočítat Jakobián a pak je nějak převést do „běžných“ výrazů, se kterými by pak kód běžel rychle. Jde to? :)
Ten tvůj tip mi ušetří editování různých souborů, což je to, na co jsem se původně ptal, takže díky. Teď mi ale navíc přijde zbytečné pokaždé ručně počítat derivace, když to Matlab umí. V případě zájmu posílám odkaz na konkrétní kód.
Offline
↑ FliegenderZirkus:
nie som expert na matlab, ale mam pocit, ze iny sposob ako docielit to co chces, asi nebude
matlabu (pri vyhodnocovani dynamickeho kodu, ktory je zapisany v retazci), by mohlo pomoct zapisat ten tvoj riadok kodu takto:
f1='x^2+3*y;';
je tam o jednu bodkociarku naviac,
ked to matlab vyhodnoti, tak bez tej podkociarky bude vysledok posielat aj na obrazovku
a ty to chces asi skor IBA do premennej 'vysledok'
ukoncenie podkociarkou by malo dost pomoct lebo sa nezapoji narocny graficky subsystem pri kazdom volani eval(f1);
tiez by som mozno skusil nieco v zmysle:
dyn_code='vysledok = x^2 + 3*y;'; eval(dyn_code); vysledok
v retazci si mozes vyskladat aky len chces kod - akurat musi byt syntakticky spravny
myslim si, ze celkovo je mozne lubovolne kombinovat staticky kod s dynamickym
Offline
este ma napadlo, ze v matlabe je velky vykonnostny rozdiel podla sposobu zapisu vypoctov do kodu.
cely matlab je optimalizovany pre vektory a matice. nasledovny priklad ukazuje rozne zapisane vypocty. vysledkom su diametralne odlisne casy.
clc; clear; max=100000; x=linspace(1,50*pi,max); y=1:1:max; yy=1:1:max; % vektor tic; y=x.^4+x.*pi+10; toc % cyklus tic; for i=1:max yy(i)=x(i)^4+x(i)*pi+10; end toc
casy vektor vs. cyklus vyzeraju takto:
Elapsed time is 0.009714 seconds.
Elapsed time is 2.266 seconds.
z coho je jasne, ze co sa da zapisat ako vektor, tak treba urobit ako vektor (pripadne maticu) a cykly pouzivat iba tam, kde je to nevyhnutne
Offline