pondělí 28. května 2007

Rada z Matlabu

Pokud máte výpočet, jehož výsledek má být komplexní, pak tento algoritmus nedávejte do for-cyklu indexovaného přes proměnnou i.

Proč? Matlab smíchá proměnnou i se stejnojmenným typem pro imaginární složku komplexního čísla a dopadne to špatně - zkrátka i nebude mít hodnotu imaginární jednotky, ale indexu ve for-cyklu (protože ten byl definovaný jako první).

Co je horší, problém se někdy může objevit i tam, kde s komplexními čísly nepracujete. Včera jsem v Matlabu implementoval algoritmus, kde se musela řešit rovnice typu polynom krát exponenciála rovno nule. Protože klasický numerický solve v Matlabu selhával, naprogramoval jsem si v rychlosti metodu největšího spádu. Fungovalo to, ale chtěl jsem si ověřit, že dostávám správný výsledek. Celá rovnice byla parametrizovaná parametrem r, a když se ten poslal limitně k nule, tak exponenciála zmizela a zůstala jednoduchá kubická rovnice.

Protože Matlab umí kubické rovnice analyticky, prohnal jsem ji přes solve - a tradá, řešení bylo úplně jiné. Tak jsem překopal celý numerický výpočet - pořád stejný výsledek. Napadlo mě, abych řešení kubické rovnice dosadil zpátky do rovnice. Zkusil jsem to, a nedostal jsem nulu.

Když už jsem začínal mít pocit, že Matlab chybně řeší kubické rovnice, udeřila mě do očí zrada z záměně i. Byla to v podstatě náhoda - s komplexním řešením jsem totiž nepočítal, protože jsem bezpečně věděl, že kořeny mají být reálné.

Jenže! Matlab při symbolickém řešení kubické rovnice samozřejmě neví, že řešení bude reálné, a tak komplexní část raději zahrne, i když ta třeba bude nakonec nulová. V mém případě se ale i z komplexní části vyhodnotilo jako index z cyklu a bylo vymalováno. Špatný výsledek byl na světě.

1 komentář:

  1. jo presne podobne pripady jsem zazil. Abych rekl pravdu casto neni cas a pak tohle. No co se da delat, clovek si musi dat pozor.

    OdpovědětVymazat