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