Lösningsförslag till inlämningsuppgift 5 i Beräkningsprogrammering Problem 1 function prob1 % Integrationsgränserna a = 0; b = 0.8; % Antalet olika n-värden np = 1; % Referensvärdet på integralen Iref = 0.657669856383957; % En vektor med antalet punkter i integrationsintervallet nvec =.^(:np+1) + 1; % En vektor för att spara resultaten från den sammansatta trapetsregeln I = zeros(np,1); for i = 1:np % Starta tidtagning % Aktuellt n-värde n = nvec(i); % En vektor med x-punkterna xvec = linspace(a,b,n) ; % Avståndet mellan varje punkt h = (b-a)/(n-1); % En vektor med bredderna på staplarna (vikterna) w = h*[0.5; ones(n-,1); 0.5]; % Integralens värde enligt den sammansatta trapetsregeln I(i) = g(xvec) *w; % Avsluta tidtagning. Bara den sista sparas. timetrap = toc; % De relativa felen relerr = abs((iref-i)/iref); 1
Relativfel % Plotta loglog(nvec,relerr, * ) xlabel( Antalet punkter n ); ylabel( Relativfel ); grid on disp([ Relativfel med trapetsregeln ( numstr(nvec(np))... punkter) : numstr(relerr(np)), beräkningen tog... numstr(timetrap) sekunder. ]) % Integralen beräknad med integral Iint = integral(@g,a,b); timeint = toc; disp([ Relativfel med "integral" : numstr(abs((iref-iint)/iref))..., beräkningen tog numstr(timeint) sekunder. ]); function gout = g(x) gout = exp(-x.^); I figuren kan man se att om antalet noder n ändras från 10 1 till 10 6 (+5 i exponenterna) så ändras det relativa felet från ungefär 10 3 till 10 13 ( 10 i exponenterna), (där punkterna är valda för att få enkla siffror). Då kan man direkt se att relativfelet avtar med kvadraten på n, dvs p i den givna formeln. Man kan också utgå från formeln, relerr I c n p, sätta in siffrorna ovan, dividera ledvis, logaritmera, och lösa ut p, varvid p ( 13 ( 3))/(6 1) =. Felet avtar alltså som c. n Matlabs integral är enkel att använda och är snabbare än den sammansatta trapetsregeln; detta eftersom den använder effektivare metoder. Den ger dessutom mindre fel. 10-10 -4 10-6 10-8 10-10 10-1 10-14 10-16 10 0 10 10 4 10 6 10 8 Antalet punkter n Figur 1: Det relativa felet i uppskattningen av I plottat mot antalet punkter n.
Problem function broms % r-värdena är ekvidistanta, så vi kan skriva r = linspace(9.38,14.58,11) ; T = [338 43 474 506 557 573 601 6 651 661 671] ; % Antalet punkter n = length(t); % Vikter för sammansatta trapetsregeln h = (r(n)-r(1))/(n-1); wtrap = h*[1/;ones(n-,1);1/]; % Beräkna integralen i nämnaren med sammansatta trapetsregeln namnaretrapets = r *wtrap % Beräkna integralen i täljaren med sammansatta trapetsregeln taljaretrapets = (r.*t) *wtrap % Medeltemperaturen beräknad med den sammansatta trapetsregeln TmedTrapets = taljaretrapets/namnaretrapets % Det analytiska uttrycket för nämnaren och felet i uppskattningen från % sammansatta trapetsregeln namnareanalytisk = r(n)^/-r(1)^/ namnarefel = abs(namnaretrapets-namnareanalytisk) % Vikter för Simpsons regel m = (n-1)/; hs = (r(n)-r(1))/m; wsimp = ones(n,1); wsimp(::n-1) = 4; wsimp(3::n-) = ; wsimp = hs/6*wsimp; % % Kortare, men svårläsligt, sätt att skapa viktvektorn: % wsimp = hs/6*[1, *rem(1:n-,)+, 1] ; % % Man kan också bara skriva upp vikterna: % wsimp = hs/6*[1;4;;4;;4;;4;;4;1]; % Täljaren beräknad med Simpsons regel taljaresimp = (r.*t) *wsimp; % Medeltemperaturen beräknad med det analytiska uttrycket för nämnaren och % med uppskattningen av täljaren gjord med Simpsons regel 3
TmedSimpAnalytisk = taljaresimp/namnareanalytisk % Skillnaden mellan de beräknade medeltemperaturerna: skillnad = abs(tmedsimpanalytisk-tmedtrapets) Att vi kan använda den sammansatta trapetsregeln beror på att r-värdena är ekvidistanta (avståndet mellan två punkter på r-axeln är konstant i integrationsintervallet), vilket gör att vi kan definiera ett h. Nämnaren blir väldigt noggrann. Detta beror på att förstagradspolynom integreras exakt med trapetsregeln. Medeltemperaturen beräknad analytiskt och med Simpsons regel skiljer sig med ungefär 0.4 C från medeltemperaturen beräknad helt med trapetsregeln. Vi vet inget om mätfel i temperaturerna, men data är givna med tre värdesiffror och har alltså maximala avrundningsfel på 0.5 C. Integralberäkningen innebär emellertid ett slags medelvärdesbildning och avrundningsfelen tar därför i stor utsträckning ut varandra. Felet i medeltemperaturen torde därför vara mindre än 1 C. Siffrorna till och med entalssiffran bör alltså tas med: T med 568 C. Problem 3 Överkurs function dblint close all % Skapa en x- och en y-vektor N = 50; xhat = linspace(-,,n); yhat = linspace(-,,n); % Skapa en matris att spara dubbelintegralens värden i P = zeros(n); for j = 1:N for i = 1:N P(i,j) = integral(@(x,y) pot(x,y,xhat(j),yhat(i)),-1,1,-1,1); % Skapa griden och plotta funktionen [X,Y] = meshgrid(xhat,yhat); [cs,h] = contour(x,y,p); clabel(cs,h, labelspacing,3000); xlabel( $\hat{x}$, interpreter, latex ) % Special för att kunna skriva ^ ylabel( $\hat{y}$, interpreter, latex ) % Special för att kunna skriva ^ axis equal toc function potout = pot(x,y,xhat,yhat) % Integranden potout = 1./sqrt((xhat-x).^ + (yhat-y).^); 4
^y 4 6 1.5 1 0.5 3 3.5 5.5 5 6.5 7 0 4.5.5-0.5-1 -1.5 - - -1.5-1 -0.5 0 0.5 1 1.5 ^x Figur : Nivåkurvor för funktionen Φ. 5