4
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@x0D f@x1D ; x1 = x0; dx = x2 - x1; k ++ >; If@k n, Print@"Konvergens ikke oppnådd etter " , n , " iterasjoner"D, Print@x0DD FF 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@@- 2DDD f@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.

Secant Method oppg fasitivarj/mathematica/Numeriske metoder... · 2014. 10. 7. · Første metode er mest lik løkkeprogrammering i C++/ Java/ MatLab. Vi kjører løkken inntil toler-ansegrensen

  • Upload
    others

  • View
    7

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Secant Method oppg fasitivarj/mathematica/Numeriske metoder... · 2014. 10. 7. · Første metode er mest lik løkkeprogrammering i C++/ Java/ MatLab. Vi kjører løkken inntil toler-ansegrensen

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.

Page 2: Secant Method oppg fasitivarj/mathematica/Numeriske metoder... · 2014. 10. 7. · Første metode er mest lik løkkeprogrammering i C++/ Java/ MatLab. Vi kjører løkken inntil toler-ansegrensen

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, [email protected], pts<, [email protected], 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

Page 3: Secant Method oppg fasitivarj/mathematica/Numeriske metoder... · 2014. 10. 7. · Første metode er mest lik løkkeprogrammering i C++/ Java/ MatLab. Vi kjører løkken inntil toler-ansegrensen

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

Page 4: Secant Method oppg fasitivarj/mathematica/Numeriske metoder... · 2014. 10. 7. · Første metode er mest lik løkkeprogrammering i C++/ Java/ MatLab. Vi kjører løkken inntil toler-ansegrensen

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