Lösningsförslag till inlämningsuppgift 3 i Beräkningsprogrammering Problem 1) function condtest format compact format long % Skapa matrisen A med alpha=1 A = [1 2 3; 2 4 1; 4 5 6]; b = [2.1; 3.4; 7.2]; n = 30; alphavec = linspace(1,6,n); for i = 1:n, alpha = alphavec(i); disp( ------------------------------- ) disp([ alpha =,num2str(alpha)]); % Byt ut elementet på rad 2, kolonn 3 mot aktuellt alpha A(2,3) = alpha; x = A\b konditionstal = cond(a) egenvarden = eig(a) För α = 1 är lösningen x = (1.46 0.08 0.16) T och konditionstalet 16.7831792. För α = 6 blir systemet singulärt (matrisen A är inte inverterbar). Detta kan man förvissa sig om genom att titta på egenvärdena: eig(a) = (12 0 1) T ; ett egenvärde är noll, varför matrisen är singulär. Man kan även titta på determinanten, som också är noll. Eventuellt ser man att andra raden är lika med första raden multiplicerat med 2, vilket också visar att matrisen är singulär. Konditionstalet för en singulär matris är oändligt stort (även om Matlab rapporterar 1.8630 10 16 ). Eftersom A inte är inverterbar då α = 6 så ger huvudsatsen i Linjär algebra att systemet antingen har oändligt många eller ingen lösning. Om man försöker lösa ekvationssystemet med hjälp av Gausselimination, och då multiplicerar första raden med 2 och lägger resultatet till den andra raden, ser man att man får 0 = 0, 8. Alltså saknar systemet lösning för detta högerled. Problem 1 Överkurs) function singekv alpha = 6; A = [1 2 3;2 4 alpha;4 5 6]; b = [50;100;23]; x = pinv(a)*b Eftersom högerledet är sådant att ekvation 1 är en multipel av ekvation 2 (nu gäller b 2 = 2b 1 ) har ekvationssystemet oändligt många lösningar. Matlabs kommando pinv ger pseudoinversen av en matris som i sin tur används för att beräkna lösningen med minst 2-norm. 1
Problem 2) function condtri % Stäng alla plotfönster close all % Antal olika systemstorlekar och systemstorlekarna nn = 20; nvec = ceil(logspace(1,2,nn)); % Förbered en vektor för konditionstalen. konditionstal = zeros(nn,1); for k = 1:nn n = nvec(k); % Sätt upp matris med storleken n D = setupmatrix(n); % Beräkna och spara konditionstalet konditionstal(k) = cond(d); % Plotta de logaritmerade värdena med plot-kommandot figure(1) plot(log10(nvec),log10(konditionstal), * ); grid on xlabel( Logaritmerad systemstorlek, lg(n) ); ylabel( Logaritmerat konditionstal, lg(k) ); % Plotta värdena med loglog-kommandot figure(2) loglog(nvec,konditionstal, * ); grid on xlabel( Systemstorlek n ); ylabel( Konditionstal k ); % Parametrarna p och alpha i formeln för konditionstalet: konditionstal=alpha*n^p p = (log10(konditionstal(nn))-log10(konditionstal(1)))/(log10(nvec(nn))-log10(nvec(1))); alfa = konditionstal(nn)/nvec(nn)^p; disp([ kappa=alpha*n^p, alfa=,num2str(alfa,2), och k=,num2str(p,2)]) function outmatrix = setupmatrix(storlek) % Sätt upp matrisen sup = ones(storlek-1,1); cen = -2*ones(storlek,1); sub = ones(storlek-1,1); outmatrix = diag(sub,-1) + diag(cen,0) + diag(sup,1); 2
Figur 1: Det logaritmerade konditionstalet som funktion av den logaritmerade systemstorleken. Figur 2: Konditionstalet som funktion av systemstorleken (logaritmerade axlar). Konditionstalet κ blir ungefär αn p, där n är systemstorleken. Uppskattningar med ledning av figuren ger α 0.5 och p 2, varför κ 0.5n 2. (Beräknas p och α med utgångspunkt från första och sista värdet, som i programmet, fås att p = 1.9317 och att alpha = 0.5661) Vid lösning av det linjära ekvationssystemet Dx = b har vi en övre begränsning på det relativa felet hos lösningsvektorn x enligt e x κe b där e b är det relativa felet i högerledet b. Om man tycker sig kunna godta (det ganska höga) maxfelet 10% hos x måste man alltså begränsa systemstorleken så att κe b = 0.1. Med e b = 0.0001 och κ 0.5n 2 ger detta en ekvation med systemstorleken n som obekant och med lösningen n 44.7. Vi måste därför hålla oss till system av storlek n 44. Om man istället kräver att felet e x ska vara mindre än 1% måste systemstorleken begränsas ytterligare, till ungefär 14. 3
Problem 3) function tridiag(n) % Systemstorleken n är inparameter till programmet. close all % u är en (n+2)x3-matris som ska innehålla lösningarna % för olika värden på lambda. Varje kolonn i matrisen % ska innehålla en lösning. u = zeros(n+2,3); lambda = [-10-100 -1000]; % Högerledet b = zeros(n,1); b(1) = 1; b(n) = 1; % Beräkna de tre lösningarna. for i = 1:3 % Sätt upp matrisen D=setupMatrix(n,lambda(i)); % Lös systemet och lägg till randvillkoren u(:,i) = [1;D\b;1]; % x-värdena h = 1/(n+1); x = h*(0:n+1); % Plotta resultatet plot(x,u(:,1), b+ ); hold on plot(x,u(:,2), g* ); plot(x,u(:,3), ro ); grid on leg( lambda=-10, lambda=-100, lambda=-1000, Location, North ); xlabel( x ) ylabel( u(x) ) function D = setupmatrix(n,lambda) % En funktion som sätter upp matrisen. sup = -ones(n-1,1); sub = -ones(n-1,1); h = 1/(n+1); cen = (2-lambda*h^2)*ones(n,1); D = diag(sub,-1) + diag(cen,0) + diag(sup,1); 4
Figur 3: Lösningarna till ekvationssystemet i Problem 3 för olika värden på λ. Problem 4 Överkurs) function konvergens close all % Generera udda systemstorlekar från 101 till 100001 nvec = 2*round(logspace(log10(50),log10(50000),50))+1; % Förbered en vektor för lösningarna i mittpunkterna. mid = zeros(size(nvec)); % Loopa igenom systemstorlekarna for j = 1:length(nvec) solution = computesolution(nvec(j),-10); mid(j) = solution((nvec(j)+1)/2); % Exakta lösningen exakt = 0.3947709748714294; % Relativa felet. relerr = abs(mid-exakt)/exakt; % Plotta i loglog-diagram. loglog(nvec,relerr, * ) grid on xlabel( Systemstorlek n ) ylabel( Relativt fel ); 5
function u = computesolution(n,lambda) % En funktion som sätter upp matrisen och högerledet % och löser systemet med storlek n och parameter lambda. % Högerledet b = zeros(n,1); b(1) = 1; b(n) = 1; % Diagonalerna sup = -ones(n-1,1); sub = -ones(n-1,1); h = 1/(n+1); cen = (2-lambda*h^2)*ones(n,1); % Sätt upp matrisen med spdiags D = spdiags([[sub;0], cen, [0;sup]],[-1 0 1],n,n); % Lös systemet u = D\b; Felet avtar som n 2 ända upp till systemstorlekar runt 10000, där konditionstalet börjar göra sig påmint. Problemet kan inte längre lösas exakt nog för att lösningen skall fortsätta konvergera. Med spdiags kan man lösa mycket stora system. n = 1000000 är inga problem. Figur 4: Konvergens av u(0.5) i Problem 4. 6
Problem 5 Överkurs) Om systemet skrivs om enligt { x 2 + y 2 = 4, e x + y = 1 { x 2 + y 2 4 = 0, e x + y 1 = 0, så syns det att lösningarna sammanfaller med nollställena till den vektorvärda funktionen ( ) ( f1 (x, y) x f(x, y) = = 2 + y 2 ) 4 f 2 (x, y) e x + y 1 vars Jacobianmatris (funktionalmatris) är f (x, y) = ( f1 x f 2 x f 1 y f 2 y ) = ( 2x 2y e x 1 ). En iteration i Newtons metod ges av: ( ) xk+1 = y k+1 ( xk y k ) f (x k, y k ) 1 f(x k, y k ). function nlineq close all % Plotta kurvorna h1 = ezplot( x.^2+y.^2-4,[-2 2-2 2]); set(h1, Color, r ) hold on h2 = ezplot( exp(x)+y-1,[-2 2-2 2]); set(h2, Color, b ) title( ) leg( x^2+y^2=4, e^x+y=1, Location, North ) % Den ena startgissningen (avläst i figur) z01 = [-1.8;0.8]; % Den andra (avläst i figur) z02 = [1;-1.7]; % Beräkna och skriv ut det första nollstället [z1,iter1] = mynewton(z01); disp([ Nollställe 1: (x,y) = ( num2str(z1(1)), num2str(z1(2))... ), f(x,y) = num2str(norm(f(z1))), antal iterationer =... num2str(iter1)]) % Beräkna och skriv ut det andra nollstället [z2,iter2] = mynewton(z02); disp([ Nollställe 2: (x,y) = ( num2str(z2(1)), num2str(z2(2))... ), f(x,y) = num2str(norm(f(z2))), antal iterationer =... num2str(iter2)]) 7
function [myzero,iter] = mynewton(zk) % Beräknar ett nollställe till den vektorvärda funktionen f % med Newtons metod. Startgissningen är vektorn zk. tol = 10*eps; dzk = zk; iter = 0; while (norm(dzk)/norm(zk) > tol) && (iter < 20) dzk = -fjac(zk)\f(zk); zk = zk + dzk; iter = iter +1; myzero = zk; function fout = f(z) % z är en vektor där första elementet är x % och andra elementet är y x = z(1); y = z(2); fout = [x^2+y^2-4; exp(x)+y-1]; function J = fjac(z) % Jacobianmatrisen hörande till f. x = z(1); y = z(2); J = [2*x, 2*y; exp(x), 1]; Lösningarna är (x 1, y 1 ) ( 1.81626, 0.837368) och (x 2, y 2 ) (1.00417, 1.72964). Figur 5: Lösningsmängderna för de två ekvationerna i ekvationssystemet i Problem 5. Lösningarna till ekvationssystemet är de punkter där dessa kurvor skär varandra. 8