View
8
Download
0
Category
Preview:
Citation preview
Sekantmetoden
Code
Første metode er mest lik løkkeprogrammering i C++/ Java/ MatLab. Vi kjører løkken inntil toler-
ansegrensen for nøyaktighet er oppnådd, dog ikke mer enn n iterasjoner. Prosedyrevis programmer-
ing er langsommere og mindere effektiv enn andre teknikker i Mathematica, men lettere å forstå.
SecantMethod@f_, 8x_, a_, b_<, n_ D :=
ModuleB9x1, x2 , tol = 10-6=,
x1 = a;
x2 = b;
dx = x2 - x1;
k = 0;
WhileBAbs@dxD > tol && Hk < nL,
:x0 = x2;
x2 = x1 -x1 - x0
f@x1D - f@x0Df@x1D ;
x1 = x0;
dx = x2 - x1;
k++
>;
If@k � n, Print@"Konvergens ikke oppnådd etter " , n , " iterasjoner"D,
Print@x0DDFF
Mathematicaprogrammet har kommandoer som effektiviserer løkkeberegninger, her benyttes
Append - kommandoen som legger til et nytt siste ledd i listen, og kommandoer for å aksessere de
to siste elementer. I sekantmetoden skal vi subtrahere de to siste elementene i listen, som ved hver
iterasjon er forskjøvet fordi listen er tillagt et nytt element
SecantMethod1@f_, 8x_, x1_, x2_<D :=
ModuleB9lst = 8x1, x2<, tol = 10-6=,
WhileBAbs@lst@@-1DD - lst@@-2DDD > tol,
lst = AppendBlst, lst@@-1DD -lst@@-1DD - lst@@-2DD
f@lst@@-1DDD - f@lst@@-2DDDf@lst@@-1DDDF
F;
lst
F
Samme metode som ovenfor, men Do - løkka gjør n iterasjoner uten tanke på om toleransegrenser
er nådd.
SecantMethod2@f_, 8x_, x1_, x2_<, n_: 1D :=
ModuleB8lst = 8x1, x2<<,
DoB
lst = AppendBlst, lst@@-1DD -lst@@-1DD - lst@@-2DD
f@lst@@-1DDD - f@lst@@-2DDDf@lst@@-1DD DF,
8i, n<F;
lst
F
Neste rutine gir et grafisk bilde av iterasjonsprosessen
SecantMethodFigure@f_, 8x_, x1_, x2_<, n_: 1, opts___D :=
Module@8xi = SecantMethod2@f, 8x, x1, x2<, nD, dotted, pts, arrows<,
dotted = Append@Table@Line@88xi@@iDD, f@xi@@iDDD<, 8xi@@i + 1DD, f@xi@@i + 1DDD<<D, 8i, 2<D,
Table@Line@88xi@@iDD, f@xi@@iDDD<, 8xi@@i + 1DD, 0<<D, 8i, 4, n + 1<DD;
arrows = Table@Arrow@88xi@@iDD, 0<, 8xi@@iDD, f@xi@@iDDD<<D, 8i, 3, n + 2<D;
pts = Table@Point@8xi@@iDD, f@xi@@iDDD<D, 8i, n + 2<D;
Show@Plot@f@xD, 8x, x1, x2<, PlotRange -> AllD,
Graphics@8arrows, 8PointSize@0.02D, pts<, 8Dashing@80.02, 0.02<D, dotted<<D,
optsDD
Oppgave 1
Tegn grafen til J 1
2
HxL, .Besselfunksjonen av orden 1
2. Bruk sekantmetoden til å bestemme nullpunk-
tet i intervallet [1,4]. Bruk 6 iterasjoner og angi intervallet numerisk.
f@x_D := BesselJB1
2, xF
Plot@f@xD, 8x, 0, 12<D
2 4 6 8 10 12
-0.2
0.2
0.4
0.6
SecantMethod@f, 8x, 1, 4.0<, 6D
2 Secant Method oppg fasit.nb
4.
3.06941
3.16071
3.1418
3.14159
SecantMethod1@f, 8x, 1, 4.0<D
81, 4., 3.06941, 3.16071, 3.1418, 3.14159, 3.14159<
At svaret blir Π, følger av den nære sammenheng mellom J 1
2
HxL og sin HxL
x
:
FunctionExpandB BesselJB1
2, xFF
2
ΠsinHxL
x
SecantMethod2@f, 8x, 1, 4.0<, 6D
81, 4., 3.06941, 3.16071, 3.1418, 3.14159, 3.14159, 3.14159<
SecantMethod2BBesselJB1
2, ðF &, 8x, 1, 4.0<, 6F
81, 4., 3.06941, 3.16071, 3.1418, 3.14159, 3.14159, 3.14159<
Oppgave2
Tegn grafen til f(x) = x ln x + x3
over intervallet [0.2, 1], Bestem nullpunktet i dette intervallet ved
sekantmetoden med 8 iterasjoner.
Vis de 4 første itersjonene grafisk.
f@x_D := x Log@xD + x3
PlotB x Log@xD + x3, 8x, 0, 1<F
0.2 0.4 0.6 0.8 1.0
-0.5
0.5
1.0
SecantMethod@f, 8x, 0.2, 1<, 8D
Secant Method oppg fasit.nb 3
1
0.532645
0.642859
0.687231
0.681315
0.681516
0.681517
SecantMethod1@f, 8x, 0.2, 1<D
80.2, 1, 0.532645, 0.642859, 0.687231, 0.681315, 0.681516, 0.681517, 0.681517<
SecantMethodFigure@f, 8x, 0.2, 1<, 4D
0.4 0.6 0.8 1.0
-0.5
0.5
1.0
4 Secant Method oppg fasit.nb
Recommended