Výpočetní technika II - Algoritmizace v systému MATLAB Aktualizace: 31. prosince 2000


Navigační menu
  Vysvětlivky
  Obsah
  Kapitola 1: Matlab
       Kapitola 1.1: Úvod
       Kapitola 1.2: Režimy práce
  Kapitola 2: Skaláry, vektory, matice
       Kapitola 2.1: Operace
       Kapitola 2.2: Funkce
       Kapitola 2.3: Submatice
  Kapitola 3: Vytváření funkcí
  Kapitola 4: Větvení a rozhodování
  Kapitola 5: While cyklus
  Kapitola 6: For cyklus
  Kapitola 7: Objekty a 2-D grafika
  Kapitola 8: 3-D grafika
  Kapitola 9: Datové soubory
       Kapitola 9.1: Ukládání do souboru
       Kapitola 9.2: Načtení ze souboru
       Kapitola 9.3: Import dat z Excelu
  Kapitola 10: Symbolická matematika
  Kapitola 11: Řešení rovnice f(x)=0
  Kapitola 12: Soustavy lineárních rovnic
  Kapitola 13: Minimum funkce f(x)
  12. Soustavy lineárních rovnic  

 
  • (rozšíření, lze zařadit kdykoli poté, co se seznámíme s funkcemi)
  • Motto: Rozdíl mezi matematikou a technikou je v tom, že matematik trvá na existenci řešení problému a jejich počtu, zatímco technik by chtěl za všech okolností vidět jen jedno rozumné řešení.
    První následek: Chce-li být matematik spokojen, používá Matlabovské funkce det, rank a inv.
    Druhý následek: Ostatní buď používají Matlabovskou funkci pinv místo inv, nebo jsou nešťastni.
  • Před započetím práce vytvořte několik regulárních, přeurčených a nedourčených soustav lineárních rovnic a nastudujte Matlabovské funkce rank, det, inv, pinv a hilb.
 

  Příklad 12A.1:  
  Vytvořte funkci pro zjištění počtu řešení soustavy lineárních rovnic.
Instrukce: Není důležité vyřešit, ale určit počet řešení pomocí hodností matic. Krokujte pro různé případy a sledujte hodnosti matic.
 
  Řešení:  
 
function [r]=Kolik(A,b)
% Urceni poctu reseni soustavy linearnich rovnic Ax=b
% [r]=Kolik(A,b);
% r ... pocet reseni
% A ... matice soustavy (m,n)
% b ... sloupcovy vektor pravych stran (m,1)
r=0; % pocatecni pesimismus
ma=size(A,1); % urceni poctu radku matice A
na=size(A,2); % urceni poctu sloupcu matice A
mb=size(b,1); % urceni delky vektoru b
nb=size(b,2); % pocet sloupcu vektoru b
if ma~=mb | nb~=1 % nevhodne rozmery matice nebo vektoru?
   return; % kolik je r?
end
ra=rank(A); % hodnost matice A
rab=rank([A b]); % hodnost rozsirene matice A|b
if ra~=rab % nestejne hodnosti?
   return; % kolik je r?
end
if ra==na % hodnost rovna poctu neznamych?
   r=1; % ma prave jedno reseni
else
   r=inf; % nema reseni
end
 
 
  Příklad 12A.2:  
  Vytvořte funkci pro testování inverzní matice.
Instrukce: Inverzní matici vynásobíme zleva původní maticí a porovnáme s jednotkovou maticí. Vlivem zaokrouhlovacích chyb není jejich rozdíl vždy nulová matice. Při jaké velikosti Hilbertovy matice bude chyba větší než jedna?
 
  Řešení:  
 
function [test]=Inverze(A)
% Numericky test inverze matice
% [test]=Inverze(A);
% test ... maximalni prvek matice A * inv(A) - I
% A ... matice (n,n)
% I ... jednotkova matice (n,n)
m=size(A,1); % urceni poctu radku matice A
n=size(A,2); % urceni poctu sloupcu matice A
if m~=n | det(A)==0 % nevhodna matice
   test=inf; % koncime
   return;
end
B=inv(A); % inverze matice
I=eye(n); % jednotkova matice
test=max(max(abs(A*B-I))); % vlastni test
 
 
  Příklad 12A.3:  
  Vytvořte funkci pro testování pseudoinverzní matice.
Instrukce: Pseudoinverzní matici vynásobíme zleva a zprava původní maticí a porovnáme s původní maticí. Vlivem zaokrouhlovacích chyb není jejich rozdíl vždy nulová matice. Při jaké velikosti Hilbertovy matice bude chyba větší než jedna?
 
  Řešení:  
 
function [test]=PseudoInverze(A)
% Numericky test pseudoinverze P matice A
% [test]=PseudoInverze(A);
% test ... maximalni prvek matice A*P*A - A
% A ... matice (m,n)
% P ... pseudoinverzni matice (n,m) podle Moora a Penroseho
P=pinv(A); % pseudoinverze matice
test=max(max(abs(A*P*A-A))); % vlastni test
 
 
  Příklad 12A.4:  
  Vytvořte funkci pro řešení maticové rovnice AX=B.
Instrukce: Použijeme pseudoinverzi matice soustavy. Krokujte pro různé soustavy rovnic.
 
  Řešení:  
 
function [X]=Vyres(A,B)
% Bezpecne reseni soustavy linearnich rovnic AX=B
% [X]=Vyres(A,B);
% X ... reseni soustavy (n,s)
% A ... matice soustavy (m,n)
% B ... matice pravych stran (m,s)
ma=size(A,1); % urceni poctu radku matice A
n=size(A,2); % urceni poctu sloupcu matice A
mb=size(B,1); % urceni poctu radku matice B
s=size(B,2); % urceni poctu sloupcu matice B
if ma~=mb % nevhodne rozmery matic
   X=zeros(n,s); % rezignace
else
   X=pinv(A)*B; % nadherne, ze
end
 
 
  Příklad 12A.5:  
  Vytvořte funkci pro proložení funkce y = a + b*x + c*sin(x) + d/(|x|+1) metodou nejmenších čtverců.
Instrukce: Báze prostoru funkcí je tvořena funkcemi: 1, x, sin x, 1/x. Matici soustavy vytvoříme ze čtyř sloupcových vektorů hodnot funkce báze. Pak použijeme pseudoinverzi. Krokujte pro přeurčené i nedourčené problémy.
 
  Řešení:  
 
function [par,LSQ]=ProlozLSQ(x,y)
% Prolozeni funkce y=a + b*x + c*sin(x) + d/(|x|+1) metodou nejmenších ctvercu.
% [par,LSQ]=ProlozLSQ(x,y);
% par ... vektor nalezenych parametru [a b c d]
% LSQ ... soucet ctvercu odchylek
% x ... vektor nezavisle promenne (1,m)
% y ... vektor zavisle promenne (1,m)
% test rozmeru
if size(x,1)~=1 | size(y,1)~=1 | size(x,2)~=size(y,2)
   par=[]; % reseni neexistuje
   return;
end
x=x'; y=y';
% zacatek konkretni casti
phi1=ones(size(x)); % prvni sloupec
phi2=x; % druhy sloupec
phi3=sin(x); % treti sloupec s pouzitim vektorove funkce
phi4=phi1./(abs(x)+1); % ctvrty sloupec a teckova konvence
% konec konkretni casti
A=[phi1 phi2 phi3 phi4]; % sestaveni matice soustavy
par=pinv(A)*y; % bez pseudoinverze ani ranu
LSQ=norm(A*par-y).^2;
% staci urcit druhou mocninu normy chyboveho vektoru
 
 
  Příklady pro samostatné vypracování  
  Příklad 12B.1:  
  Modifikovaná Hilbertova matice má stejné absolutní hodnoty prvků jako původní matice, ale znaménka jejích prvků se šachovnicově střídají tak, že lichému součtu indexů odpovídá záporné znaménko. Sestavte funkci ModiHilbert pro její výpočet a použijte jí k testování inverze a pseudoinverze  
 
  Příklad 12B.2:  
  Marquardtova metoda řešení soustavy lineárních rovnic je dána vzorcem x=inv(A’*A+lambda*I)*A’*b pro lambda>0. Součet čtverců odchylek je roven normě vektoru A*x-b. Sestavte funkci, která vrací jak řešení, tak součet čtverců odchylek. Pro jakou kladnou hodnotu parametru lambda je součet čtverců odchylek minimální?  
 
  Příklad 12B.3:  
  Bázi můžeme obecně chápat jako vektorovou funkci vektorové proměnné. Vytvořte bázi z funkcí: 1, x1, x2, 1/x1, 1/x2, x1*x2, x1/x2, x2/x1, x1/(x1+x2) jako Matlabovskou funkci se vstupním vekrorem délky 2 a výstupním vektorem délky 9. Pak vytvořte obecnou funkci pro proložení dat metodou nejmenších čtverců. Vstupní parametry funkce by měly být: název báze, matice x a vektor y. Výstupními parametry by měly být vektor konstant regrese a součet čtverců odchylek.  
 
  Příklad 12B.4:  
  Vytvořte bázi pro polynom n-tého stupně jedné proměnné.  
 
  Příklad 12B.5:  
  Vytvořte bázi pro lineární funkci n-proměnných.  
 
  Příklad 12B.6:  
  Vytvořte bázi pro kvadratickou funkci n-proměnných.  
 
  Příklad 12B.7:  
  Teplotní pole je dáno čtvercovou sítí o rozměrech m, n. Na horním okraji pole je teplota 100 stupňů Celsia. Ostatní body na okraji pole mají teplotu 20 stupňů Celsia. Ve zbylých (m-2)*(n-2) bodech sítě je teplota rovná průměrné teplotě v sousedních bodech. Vygenerujte příslušnou soustavu lineárních rovnic a vyřešte jí. Sousedství v síti můžeme chápat různým způsobem: 4 sousedi do kříže, 4 sousedi diagonálně, 8 sousedů se stejnými vahami nebo 8 sousedů s vahami 2 a 1. Porovnejte všechny čtyři definice sousedství. Znázorněte graficky.  
 
  Seznam použitých příkazů  
  rank, det, inv, pinv a hilb  



© 2000 by Darina Bártová, Jaromír Kukal, Martin Pánek

Testováno v prohlížečích MSIE 5.x a NN 4.x při rozlišení 1024x768x256