Sekantmetoden

Fra Wikipedia, den frie encyklopædi
Spring til navigation Spring til søgning
Acap.svgIndforstået sprog
Denne artikel er skrevet i et meget indforstået sprog. Du kan gøre artiklen bedre ved at omskrive den i et sprog, der er lettere at forstå for folk uden forudgående viden om emnet.
Searchtool.svg Denne artikel bør gennemlæses af en person med fagkendskab for at sikre den faglige korrekthed.

Sekantmetoden er en matematisk metode til at søge efter en rod. Hvor en rod er den værdi, for hvilken en funktion antager værdien 0.

Problemet[redigér | redigér wikikode]

Så vi leder altså efter den værdi af x, som løser

Hvis sekantmetoden skal kunne finde løsningen, skal funktionen opføre sig "pænt" glat omkring roden ellers kan de foreslåede løsninger springe frem og tilbage og muligvis vil metoden ikke konvergere og derfor aldrig finder en rod.

Beskrivelse af metoden[redigér | redigér wikikode]

Illustration af metoden:

Animation zeigt mehrere Iterationsschritte des Sekantenverfahrens

Sekantmetoden kræver, at man har funktionsforskriften og to forskellige x-værdier, hvor man kan starte metoden fra. Herefter gentages metoden, indtil roden er fundet med en passende nøjagtighed, så som det første kan vi finde y-værdierne til de kendte x-værdier:

Den lige linje der går gennem og kaldes en sekantlinje, og vi kan nemt finde forskriften som:

og når vi isolerer x, og løser den med hensyn til y=0, finder vi x-værdien i sekantlinjens rod.

Hvis f(x) er meget tæt på at ligne en lige linje mellem og , er sekantlinjens rod meget tæt på f(x)'s rod. Vi kan finde forskellen ved at evaluere f(x), så bliver forskellen mellem f(x) og nul til fejlen:

hvis fejlen er større end vi tillader, kan vi gentage processen, og her siger sekantmetoden, at hvis vi genbruger , som , og som , bør fejlen blive mindre næste gang. Generelt kan det udtrykkes sådan:

hvilket kan kodes som:

 1 public static double Secant(double x0, double x1, Func<double, double>f, double tolerance = 0.0001, int maxSteps = 100)
 2 {
 3     double dX = x1 - x0;
 4     if (dX == 0)
 5         throw new DivideByZeroException("the two points provided for the secant method, are so similar, that I cannot determine a slope, or the slope is vertical");
 6     
 7     double y0 = f(x0);
 8     double y1 = f(x1);
 9     
10     if(y0 <= tolerance)
11         return x0;
12 
13     if(y1 <= tolerance)
14         return x1;
15     
16     double x2 = x1 - ( (x1 - x0) / (y1 - y0) ) * y1
17     
18     for(int i = 0; i < maxSteps, i++)
19     {
20         x0 = x1;
21         y0 = y1;
22         
23         x1 = x2;
24         y1 = f(x2);
25         
26         if(y1 <= tolerance)
27             return x1;
28             
29         x2 = x1 - ( (x1 - x0) / (y1 - y0) ) * y1
30     }
31     throw new Exception("Did not produce a number within tolerance, before I ran out of allowed steps. Possible divergens issues?")
32 }

Referencer[redigér | redigér wikikode]

Broom icon.svgDer er ingen kildehenvisninger i denne artikel, hvilket er et problem.
Du kan hjælpe ved at angive kilder til de påstande, der fremføres i artiklen.
Question book-4.svg