Contents
Programkonstruktion (forts)
Egendefinerade funktioner och loopar
Iterera för att approximera t.ex. en längd eller en area (eller en sökt rot). Funktionerna polylen och polyarea har ni skrivit i lab3b.
type polylen type polyarea
function L = polylen(x,y) n = length(x); L = 0; for i=1:n-1 L=L+sqrt((x(i+1)-x(i))^2+(y(i+1)-y(i))^2); end function A = polyarea(x,y) n = length(x); A = 0; for i = 1:n-1 A=A+(x(i+1)+x(i))*(y(i+1)-y(i)); end A=abs(A)/2;
Ex. Arean av en cirkel:
t = linspace(0,2*pi);
x = cos(t); y = sin(t);
figure(1); clf; plot(x,y); axis equal

A1 = polyarea(x,y);
disp(pi-A1) % jämför med exakt svar
0.0021
Bättre approximation med flera punkter
clc for n = [200 400 1000] t = linspace(0,2*pi,n); x = cos(t); y = sin(t); A1 = polyarea(x,y); disp(pi-A1) end
5.2195e-04 1.2984e-04 2.0712e-05
Ex Beräkna båglängd av f(x) = x-xcos(x), -10 < x < 10
% Rita kurva x = linspace(-10,10); y = x-x.*cos(x); figure(1);clf; plot(x,y); hold on

Approximera båglängd med 5 pktr
x = linspace(-10,10,5); y = x-x.*cos(x);
plot(x,y,'red');
l = polylen(x,y)
l = 43.5616

Bättre med fler punkter
x = linspace(-10,10,1000); y = x-x.*cos(x); l = polylen(x,y)
l = 72.0623
Hur bra blev det?
df = @(x)x.*sin(x)-cos(x)+1;
f = @(x)sqrt(1+df(x).^2);
I = integral(f,-10,10) % Matlabs integralkommando
I = 72.0637
Skriv en funktion som skapar en Hilbertmatris
A(i,j) = 1/(i+j-1)
type min_hilbert
function A = min_hilbert(n) for i = 1:n for j = 1:n A(i,j) = 1/(i+j-1); end end
Ex. Leta igenom en matris efter ett värde
A = [0 0 1 1 1; 1 0 0 2 1; 0 1 2 2 1; 1 1 1 1 1]
A = 0 0 1 1 1 1 0 0 2 1 0 1 2 2 1 1 1 1 1 1
% Vilka värden har i och j efter sekvensen? [m,n] = size(A); for i = 1:m for j = 1:n if A(i,j) == 2 return; end end end
type finns2.m
function t = finns2(A) [m,n] = size(A); t = false; for i = 1:m for j = 1:n if A(i,j) == 2 t = true; return end end end
Borra hål i en platta
En numeriskt styrd borrmaskin ska borra ett antal hål i en platta. Det visar sig att en stor del av tiden går åt för borrmaskinen att flytta sig från ett hål till ett annat. Man vill därför minimera längden av förflyttningarna genom att låta maskinen borra hålen i en lämplig ordning.
Lämplig ording: Varje gång borrmaskinen har borrat klart ett hål, välj det hål som ligger närmst och inte redan har borrats.
% Ritar plattan med hålen markerade n = 10; % antal hål som ska borras [xh,yh] = placering_av_hal(n); % slumpar fram hålens placering figure(1); clf; plot(xh,yh,'x','markersize',15,'linewidth',2); nr = 1:n; for i = 1:n text(xh(i)+5,yh(i),num2str(nr(i)),'fontsize',15); end axis([-5,105,-5,105]);

Skriv ett program som läser in hålet där borrmaskinen ska börja och som sedan beräknar i vilken ordning hålen ska borras.
% En funktion som beräknar hålet som ligger närmast ett visst hål type narmast
function k = narmast(xh, yh, pkt) % avstånden l = sqrt( (xh-xh(pkt)).^2 + (yh - yh(pkt)).^2 ); l(pkt) = Inf; % för att inte hitta 0 [x, k] = min(l); % minsta avståndet
start=1; x = xh; y = yh; ordning = start; % punkternas borrordning for i = 2:n nasta = narmast(x,y,start); ordning(i) = nasta; x(start) = Inf; % hålet har borrats y(start) = Inf; start = nasta; end disp(ordning)
1 7 4 2 9 5 10 6 8 3
Jämför förflyttningslängden
polylen(xh,yh) % ordning 1, 2, ..., 10
polylen(xh(ordning), yh(ordning))
ans = 503.4341 ans = 274.2983