Matlabについて質問2
二分法とニュートン法について、どのようにプログラムを書けばいいのでしょうか?
具体的には、fortranでは、以下のように書かれているのですが、、、
y=-x^2+5x+2
(以下のページ
http://www8.plala.or.jp/uemura/sim2.html
を参照しています。)
(二分法)
DOUBLE PRECISION X,AX,X1,X2,Y1,Y2,YA,Y
X=1
H=0.1
X1=0 !低い方のxの初期値
X2=5 !高い方のxの初期値
100 AX = (X1 + X2) / 2 !2つの初期値の平均
Y1 = Y(X1)
Y2 = Y(X2)
YA = Y(AX)
IF (YA.EQ.Y1.AND.YA.EQ.Y2) GOTO 200
IF (Y1.GE.Y2) THEN
X2 = AX
GOTO 100
END IF
IF (Y2.GE.Y1) THEN
X1 = AX
GOTO 100
END IF
200 WRITE(*,*) 'X*= ', X1
WRITE(*,*) 'Y*= ', Y1
END
DOUBLE PRECISION FUNCTION Y(X)
DOUBLE PRECISION X
Y=-X**2+5*X+2
END
これを実行すると以下のようになる。
X*= 2.499999981373549
Y*= 8.250000000000000
(ニュートン法)
DOUBLE PRECISION X,H,DY1,DY2,DY3,Y1,Y,DY
X=1 !xの初期値
H=0.1 !ステップ幅の初期値
100 DY1 = DY(X)
DY2 = DY(X + H)
DY3 = DY(X - H)
IF (ABS(DY1).LT..000001) GOTO 200 !収束判定
IF (ABS(DY2).LT.ABS(DY1).AND.ABS(DY2).LT.ABS(DY3)) THEN
X = X + H
GOTO 100
END IF
IF (ABS(DY3).LT.ABS(DY1).AND.ABS(DY3).LT.ABS(DY2)) THEN
X = X - H
GOTO 100
END IF
IF (ABS(DY1).LE.ABS(DY2).AND.ABS(DY1).LE.ABS(DY3)) THEN
H = H / 10
GOTO 100
END IF
200 Y1 = Y(X)
WRITE(*,*) 'X*= ',X
WRITE(*,*) 'Y*= ',Y1
END
DOUBLE PRECISION FUNCTION Y(X)
DOUBLE PRECISION X
Y=-X**2+5*X+2
END
DOUBLE PRECISION FUNCTION DY(X) !微分式の定義
DOUBLE PRECISION X
DY=-2*X+5
END
これを実行すれば以下のようになる。
X*= 2.500000022351742
Y*= 8.250000000000000