Splinebilen och andra rymdytor eller Golfbanorna och företagsbilen Michael Litton & Farid Bonawiede
Rapporten behandlar konstruktion av splineytor och numerisk integration. Metoder och tillförlitlighet diskuteras. Resultaten är till stor del grafiska då uppgiften är av sådan natur. Rapporten är utformad som ett rollspel där Michael Litton och Farid Bonawiede agerar konsulter åt ett företag. Detta föredrag har givit oss uppdraget att lösa ett par uppgifter. Innehåll Bakgrund. Golfbanan.............................. Bilen................................ Problem. Uppdraget............................. Metoder. Naturliga splines.......................... Bikubisk interpolation....................... Integration av rymdytor....................... Trapetsregeln......................... Dubbelintegraler..................... Resultat 5. Golfbanorna............................ 5. Bilarna.............................. 6 5 Tillförlitlighetsanalys 7 6 Slutsatser 7 7 Bilaga: MATLAB kod 9
Bakgrund. Golfbanan Företaget har nyligen bestämt sig för att konstruera ett par golfbanor. De behöver hjälp med att beräkna den mängd jord som krävs för att skapa de olika golfbanorna. Företaget är beläget i Danmark där marken kan antas vara helt slät. Vi har erhållit en lista beskrivande höjderna hos de olika kullarna på banorna.. Bilen Vi har också fått i uppdrag att konstruera den nya företagsbilen. Ett lite mera sportigt utsee är efterfrågat. Problem. Uppdraget För att optimera arbetet mot företaget bestämde vi oss för att konstruera en funktion som hanterade golfbanor av godtyckligt usee, landscape(z,dt). Det valda utvecklingsverktyget är MATLAB. Då man beskriver en golfbana i form av höjder hos olika kullar är det lämpligt att skapa en matris innehållande höjderna. Utifrån denna matris kan ett landskap konstruerats. För att sedan beräkna mängden jord som krävs behöver vi ta reda på volymen som landskapet täcker. Problemet är således att Skapa en höjdmatris Välj en lämplig metod för landskapskonstruktion Välja en lämplig metod för att ta reda på mängden jord som golfbanan kommer att kräva Det är önskvärt att övergångarna mellan kullarna är mjuka så att golfspelarna inte riskerar att göra sig illa under en runda. Det är därför lämpligt att använda sig av naturliga splines för att skapa landskapet. Då vi önskar skapa vårt landskap ställs vi inför problemet: Hur interpolation genom n stycken par av (x i, y i, z i ) punkter skall göras. Vi känner inte till lutningarna i någon punkt. Kan detta göras? Metoder De två metoder som används för att lösa problemet innefattar dels splines för att beskriva ytan och karossen samt volymsintegration med trapetsmetoden.
. Naturliga splines Metoden bygger på interpolation med kubiska splines som beskrivs på s. i []. Då vi använder oss av denna metod och med a kravet kontinuerliga första- och andra derivator erhåller vi enbart n ekvationer, men vi vill lösa ett ekvationssystem med n obekanta. Vi lägger då till två stycken krav, de naturliga villkoren, för att lösa problemet. Andraderivatorna i ändpunkterna sätter vi lika med noll. Vi har nu n stycken ekvationer och kan då beräkna lutningarna. Sedan använder man sig av hermiteinterpolation, [] s. 8, för att rita upp kruvan.. Bikubisk interpolation För att skapa en rymdyta interpolerar man i två steg, först i x-led och sedan i y-led. Det spelar ingen roll i vilket ordning man gör det, resultatet blir detsamma. Golfbanan beskrivs av en 7 5 matris och vi väljer att interpolera i steg om, längdenheter. Börjar vi i x-led kommer vi mellan varje höjd erhålla fyra stycken nya värden, sammanlagt 6 stycken, alltså en fås en 7 matris tillsammans med våra fem höjdvärden. Sedan använder man den nya matrisen och interpolerar i y-led. Återigen erhåller vi fyra stycken nya värden mellan varje höjd, sammanlagt stycken. Resultatet blir en matris. För att rita upp den använder vi oss av kommandot surf(z), där Z är matrisen innehållande höjderna. Minskas steglängden blir ytan jämnare men matrisen blir större och beräkningarna tar längre tid.. Integration av rymdytor.. Trapetsregeln För att ta reda på mängden jord som krävs behöver vi beräkna volymen under ytan vi har skapat oss. Detta gör vi genom att använda trapetsregeln för för splines. En beskrivning av trapetsregeln hittas på s. 57 i []. Emellertid så är den speciell i splinefallet och man kan visa att xn f(x)dx = h n (y i + y i+ ) + h n (k i k i+ ) = T (h) h x (k N k ) i= i= Beviset finns på s. 6 i []. Nu då vi känner till detta samband krävs lite kunskap om numerisk behandling av dubbelintegraler innan vi kan ta reda på vilken mängd jord som krävs... Dubbelintegraler När vi skapade rymdytan gjorde vi det i två steg, ett liknande tillvägagångssätt tillämpas när vi beräknar volymen. Principen är att man först skapar sig
ett antal skivor i x-led, imensionell integration, och sedan sveper o ver dom i y-led. Det blir en imensionell integration till. Eftersom vi redan har en uppdelning i x- och y-led beho ver vi inte go ra den annars no dva ndiga separationen. I x-led har vi stycken skivor med z-va rden tillho rande var skiva. Fo rst integrerar vi o ver var och en av dessa och sparar resultatet, kalla det gi. Da refter sa uytnyttjar vi va ra gi i formeln fo r trapetsintegration och kan bera kna volymen under ytan. Volymen = nx x + gi i=. g + gnx + h (knx + k ) Resultat Golfbanorna Nedan redovisas bilder pa den fo rsta golfbanan och na gra andra modeller. Axlarnas skalor a r inte likadana i alla figurer. Mindre volym inneba r billigare golfbana. Golfbana Matris 5 7 6 6. 5 5.. 9 9 Volym 6 5..5 78.956 v.e.5 v.e 7.5578 v.e
Golfbana Matris. Volym 9.776 v.e Bilarna Ha r a r en skiss o ver den a ldre fo retagsbilen som skall fo rba ttras. Framparti Bakparti Hela bilen Pa grund av Farid Bonawiedes olyckliga insjuknande la mnades bilen ute i det fina va rva dret i na gra dagar. 6
5 Tillförlitlighetsanalys Analysen består av två delar, en visuell och en numerisk. I den förstnämnda kontrollerar vi att det inte förekommer några jack, konstiga eller överdrivna lutningar i landskapet. Vid en symmetrisk matris skall också detta återges i landskapet. För att kontrollera att vi utför integrationen korrekt använder vi oss av en enkel yta, ett horisontellt plan, samt MATLABs inbyggda trapetsintegration. Eftersom vi använder oss av Hermites interpolationsformel blir beräkningarna välkonditionerade och det behövs såldes inte utföras någon experimentell störningsanalys. Detta är emellertid nödvändigt om vi inte hade arbetat med splines. Tabell : Integrationer vid olika steglängder Steglängd (dt) T (h) h (k N k )/ T (h).5 79.65769769 78.88857. 79.76979 78.9895595. 78.968698999 78.958876978.5 78.957997886 78.9989758. 78.95795 78.95577756.5 78.9558955897 78.9557777557 Integrationerna har gjorts över ytan som ges av 5 6 7 6 5 9 Z = landscape( 5, dt) 6 De utförligaste kontroller vi har haft möjlighet att göra är över olika horisontalplan, och 5 5, där punkterna är ekvidistanta och höjden är ett. Dessa integrationer har givit 6 v.e samt 5 v.e. Vi har också approximerat olika höjder med koner och även där funnit att våra volymberäkningar är tillförlitliga. Således är denna metod lämplig då frågeställningen är hur mycket jord vi behöver köpa för att bygga upp landskapet. 6 Slutsatser Hur lämpliga är nu dessa metoder för att konstruera golfbanor och bilkarosser? Rent estetiskt, tillsammans med MATLABs D funktioner, är dom bra. 7
Vill man konstruera mer avancerade objekt fungerar det inte att använda sig av höjdmatriser. Istället brukar man använda sig av NURBS (Non Uniform Rational B-Splines). En introduktion till B-Splines finns i [], s. 5. När det gäller integrationen har vi funnit att vi når tillförlitliga resultat, dvs. inte helt absurda volymer. Antalet korrekta siffror är relativt lågt, tre eller fyra stycken, vilket gör att vi anser att en annan metod bör användas om hög precision är önskvärd.vid små steg (.5 -.) tar beräkningarna lång tid, vilket delvis beror på icke optimerad kod. 8
7 Bilaga: MATLAB kod function landscape = landscape(z,dt) % Skapar en yta utifrn en hjdmatris av godtycklig storlek % LANDSCAPE(Z,T) dr T r steglngden och Z r hjdmatrisen t = :dt:; K_kort = []; K_lang = []; % For-loop som erhller samtliga lutningar kort-led for i=:length(z) dy = diff(z(i,:)); % Skapa vr b - vektor b = *dy(); b5 = *dy(); bm = [*dy(:) + *dy(:(-))]; b = [b bm b5] ; % Skapa den tridiagonala matrisen % Vi utnyttjar att vi vet h = p = ones(,length(dy)); d = [ *ones(,(length(dy)-)) ]; k = tridia(d,p,p,b); K_kort = [K_kort; k ]; % D vi har erhllit lutningarna i bde kort- och lngled % kan vi hermiteinterpolera fr att f det efterskta landskapet. % Kort-interpolation z = []; for i=:length(z) dy = diff(z(i,:)); g = K_kort(i,:length(dy)) - dy; c = *dy - (K_kort(i,:length(dy)) + K_kort(i,:length(dy)+)); z = []; for j=:length(dy) yt = z(i,j) + t*dy(j) + t.*(-t)*g(j) + t.^.*(-t)*c(j); z = [z yt(:)]; 9
% Ful-hack if i == z = z; else z = [z; z]; z = [z(:,) z]; % for-loop som erhller samtliga lutningar i lng-led for i=:length(z) dy = diff(z(:,i)) ; % Skapa vr b - vektor b = *dy(); b6 = *dy(length(dy)); bm = [*dy(:length(dy)) + *dy(:length(dy)-)]; b = [b bm b6] ; % Skapa den tridiagonala matrisen % Vi utnyttjar att vi vet h = (ekvidistant) p = ones(,length(dy)); d = [ *ones(,length(dy)-) ]; k = tridia(d,p,p,b); K_lang = [K_lang; k ]; % Transponering s den matchar z K_lang = K_lang ; % Kort-interpolation Z = []; for i=:length(z) dy = diff(z(:,i)); g = (K_lang(:length(dy),i) - dy) ; c = (*dy - (K_lang(:length(dy),i) + K_lang(:length(dy)+,i))) ; z = []; for j=:length(dy) yt = z(j,i) + t*dy(j) + t.*(-t)*g(j) + t.^.*(-t)*c(j); z = [z yt(:)]; % Ful-hack
if i == Z = z; else Z = [Z; z]; Z = [z(,:) Z]; Z = Z ; % surfc(z) medfr en konturplot under ytan % Vi vljer att anvnda surf(z) av estetiska skl % Skalar om vrt landskap till rtt storlek A = size(z); X = :dt:a(); Y = :dt:a(); surf(x,y,z), hold on; % Ljussttning lightangle(5,) set(gcf, Rerer, OpenGL ) set(findobj(gca, type, surface ),... FaceLighting, phong,... AmbientStrength,., DiffuseStrength,.8,... SpecularStrength,.9, SpecularExponent,5,... BackFaceLighting, unlit ) colormap summer; material dull; landscape = Z; % Integraterar fram volymen under ytan % ------------------------------------------------------- fsum=; ftot=; Zrad=size(Z,); Zkol=size(Z,); for k=:(zkol-) f=dt/*(z(:,k)+z(:,k+)); kk=-dt^*/*(k_lang(,k)-k_lang(,k)); fsum=f+fsum+kk; fsumman=;
for r=:(zrad-) f=dt/*(fsum(r)+fsum(r+)); kk=-dt^*/*(k_kort(r,)-k_kort(r,)); fsumman=fsumman+f+kk; % Bilen % ------------------------------------------------------- %Bygger upp fronten z=[.5 ; 5;.. 5 5.; 5;.5 ] ; y=(:dt:); x=-:dt:; %Bygger upp bakpartiet a=.7; z=[.5 ; 8 9 8.5; 9 9 ; 8 9 8.5;.5 ] ; y=a+(:dt:6); x=-:dt:; %Skapar en totalmatris fr karossen X=(-::); Y=[y y]; Z=[z; z]; % ------------------------------------------------------- Referenser [] G. Eriksson, Numeriska Algoritmer med MATLAB