7 DM -. Obligatoriske Opgave Løsning af ligningssystem vha. fipunktmetoden Jacob Christiansen, 8 moffe@imada.sdu.dk Institut for MAtematik og DAtalogi, Syddansk Universitet, Odense. Opgaven Der skal implementeres et program der udføre 5 iterationer af fipunktmetoden, med startgættet = = =. Ligningssystemet som der skal udføres beregninger på ses nedenfor. X = cos( / /) / X = ( / /) / X = cos( / /) / Desuden skal fejlen efter 5 iterationer beregnes, samt der skal argumenters for konvergensen.. Teori Fipunktmetoden er implementeret, som beskrevet i notehæftet Numerisk Analyse, Edmund Christensen,. Beregning af fejl, er lavet på baggrund af samme notehæfte, sætning., s.. For at argumentere for konvergensen, bruges sætning. fra note hæftet.. Implementation Jeg har valgt at implementere programmet i Java, da jeg mener at Java s medfølgende pakker, har de funktionaliteter som jeg har brug for. Jeg har valgt at lave hele programmet som en klasse, hvor jeg først initialisere alle variabler og de arrays, som jeg skal bruge, alle arrays er af typen double. Herefter beregner jeg alle erne, samtidig med at jeg beregner alle d k og d k / d k-. Herefter udskriver jeg alle beregnede værdier og beregner fejlen efter 5 iterationer. Den værdi af c, som er sat ind ved beregning af fejlen, er manuelt sat ind efter at have kørt programmet. Kildekoden til programmet er vedlagt som bilag.. Fejl Når fejlen beregnes, bruges.. Denne gælder såfremt d k / d k- har en grænseværdi. Vi kan af gode grunde ikke vide hvad denne grænseværdi er, men vi kan komme med et godt gæt, på baggrund af vores beregnede resultater. Ser vi på de beregnede værdier af d k / d k-, ser vi at d k / d k- går mod noget der ikke er ret meget over.78. Så ifølge., skal vi vælge et c, der er større eller lig med d k / d k-. Dette gælder for et. ordensmetode. Her har jeg valgt at sætte c =.79. Når fejlen er beregnet ser vi at fejlen ca. ligger på. decimal på alle -værdier. Udskrift fra programet, med alle beregnede værdier, er vedlagt som bilag.
5. Konvergens For at vise at fipunktmetoden konvergere, er vi nød til at vise Dφ(,, ) a < Så jeg har beregnet Dφ(,, ), den ser ud som følgende. ( ) = cos cos,, Dϕ Herefter indsætter vi vores startgæt, X = X = X = ( ) =,, ϕ D Til sidst tager vi uendeligheds-normen = Her ser vi tydeligt at det opfylder den betingelse, som vi satte op til at starte med. Heraf ser vi at fipunktmetoden konvergere. 6. Konklusion Vi har lavet et program der vha. fipunktmetoden udføre 5 iterationer på et ligningssystem. Herefter har vi beregnet fejlen, og set at den ligger på. decimal. Desuden har vi vist at metoden konvergere.
// Import import java.util.*; import java.io.*; public class fip { // Main public static void main ( String Args []) { //initialisering af arrays og variabler double =, =, =, l, l, l; String space5 = " "; String space = " "; String k, tmp; double[] a = new double[5]; double[] a = new double[5]; double[] a = new double[5]; double[] d = new double[5]; double[] d = new double[5]; double[] d = new double[5]; double[] d = new double[5]; double[] d = new double[5]; double[] d = new double[5]; //beregning af 'er, d'er og d/d'er for ( int i = ; i < 5; i) { l = Math.cos((/)(/))(Math.pow(,)/); a[i] = l; l = Math.((/)-(/))(Math.pow(,)/); a[i] = l; l = Math.cos((/)(/))(Math.pow(,)/); a[i] = l; if ( i > ) { d[i] = a[i] - a[i-]; d[i] = a[i] - a[i-]; d[i] = a[i] - a[i-]; if ( i > ) { d[i] = Math.abs(d[i]) / Math.abs(d[i-]); d[i] = Math.abs(d[i]) / Math.abs(d[i-]); d[i] = Math.abs(d[i]) / Math.abs(d[i-]); = l; = l; = l; //udskrift af beregininger System.out.println( " k k k k " ); System.out.println( " ---- ------------------------- ------------ ------------- ------------------------- " ); for ( int j = ; j < 5; j ) { tmp = Integer.toString(j); k = space.substring(,-tmp.length())tmp;
System.out.print( " " k " "); tmp = Double.toString(a[j]); k = tmpspace5.substring(,5-tmp.length()); System.out.print( " " k); tmp = Double.toString(a[j]); k = tmpspace5.substring(,5-tmp.length()); System.out.print( " " k ); tmp = Double.toString(a[j]); k = tmpspace5.substring(,5-tmp.length()); System.out.print( " " k " "); System.out.println( " k dk dk dk " ); System.out.println( " ---- ------------------------- ---------- --------------- ------------------------- " ); for ( int g = ; g < 5; g ) { tmp = Integer.toString(g); k = space.substring(,-tmp.length())tmp; System.out.print( " " k " "); tmp = Double.toString(d[g]); k = tmpspace5.substring(,5-tmp.length()); System.out.print( " " k ); tmp = Double.toString(d[g]); k = tmpspace5.substring(,5-tmp.length()); System.out.print( " " k ); tmp = Double.toString(d[g]); k = tmpspace5.substring(,5-tmp.length()); System.out.print( " " k " "); System.out.println( "------------------------------------------ -- System.out.println( " k dk / dk- dk / dk- dk / dk- " ); System.out.println( " ---- ------------------------- ------------ ------------- ------------------------- " ); for ( int l = ; l < 5; l ) { tmp = Integer.toString(l); k = space.substring(,-tmp.length())tmp; System.out.print( " " k " "); tmp = Double.toString(d[l]); k = tmpspace5.substring(,5-tmp.length()); System.out.print( " " k); tmp = Double.toString(d[l]); k = tmpspace5.substring(,5-tmp.length()); System.out.print( " " k);
tmp = Double.toString(d[l]); k = tmpspace5.substring(,5-tmp.length()); System.out.print( " " k " "); //beregning af fejlen efter 5 iterationer double e = Math.abs(.79/(-.79)*d[]); double e = Math.abs(.79/(-.79)*d[]); double e = Math.abs(.79/(-.79)*d[]); //udskrift af fejlen System.out.println( "e 5: " e ); System.out.println( "e 5: " e ); System.out.println( "e 5: " e );