Sekantmetoden
Denne artikel har flere problemer. Hjælp med at løse dem eller diskutér problemerne på diskussionssiden. (Se hvornår og hvordan denne besked kan fjernes) (Lær hvordan og hvornår man kan fjerne denne skabelonbesked) |
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
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
Illustration af metoden:
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:
public static double Secant(double x0, double x1, Func<double, double>f, double tolerance = 0.0001, int maxSteps = 100)
{
double dX = x1 - x0;
if (dX == 0)
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");
double y0 = f(x0);
double y1 = f(x1);
if(y0 <= tolerance)
return x0;
if(y1 <= tolerance)
return x1;
double x2 = x1 - ( (x1 - x0) / (y1 - y0) ) * y1
for(int i = 0; i < maxSteps, i++)
{
x0 = x1;
y0 = y1;
x1 = x2;
y1 = f(x2);
if(y1 <= tolerance)
return x1;
x2 = x1 - ( (x1 - x0) / (y1 - y0) ) * y1
}
throw new Exception("Did not produce a number within tolerance, before I ran out of allowed steps. Possible divergens issues?")
}
Referencer
Der er ingen kildehenvisninger i denne artikel, hvilket er et problem. (februar 2017) (Lær hvordan og hvornår man kan fjerne denne skabelonbesked) |
Medier brugt på denne side
Exclamation mark for ambox use
Forfatter/Opretter:
- Original: Ralf Pfeifer at tysk Wikipedia
- Derivative work: Muffin (removed caption)
Die Animation zeigt mehrere Iterationsschritte des Sekantenverfahrens
- Hinweis: Von Wikipedia skalierte Versionen dieser animierten GIF-Datei können fehlerhaft sein!
- Erläuterung zur Entstehung dieser Grafik: http://www.arstechnica.de/computer/imaging/animation/animation.html