二分法とニュートン法について、どのようにプログラムを書けばいいのでしょうか?
具体的には、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
A 回答 (1件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
なんだかなあ…
これってMatlabの問題なんですかね?
二分法だけ取り上げます。
あなたの参照したページの中では、
「解x*よりも小さい値と大きい値の2つの初期値を与え、その平均値を計算し、この3つのxから得られるyの中で最も小さいxを捨て、新たに平均値を計算するという技法である」
って書いてますね?
また、かのwikipediaでは
http://ja.wikipedia.org/wiki/%E4%BA%8C%E5%88%86% …
ここでは、f(x) = 0となるxを求める方法について説明する。
1.f(x1)とf(x2)とで符号が異なるような区間下限x1と区間上限x2を定める。
2.x1とx2の中間点xMを求める。
3.f(xM)の符号がf(x1)と同じであればx1をxMで置き換え、f(x2)と同じであればx2をxMで置き換える。
4.2.に戻って操作を繰り返すことにより、f(x) = 0となるxに近づく。
という説明が書かれています。
(Matlab独特の書き方に頼るということをするのでなければ)この文章を愚直にプログラムにおこすだけの話だと思うんですが。プログラムとして難しそうなのは上記手順の3.でしょうか。これもif文の基本的な構文を知っていればできますね。
ちなみに、Matlabには入力値の符号を返す関数signがあるので、これを有効活用してやればよいでしょう。
ニュートン法も同じです。「文章で書かれたことをマジメにプログラムにおこす」この一手です。
「とりあえずこう書いてみたんだけど動かない」とか「こう書いたんだけど時間がかかってしょうがない、もっと高速に出来ないものか」とかであればその点補足いただければより有益な回答が付くのではないかと思われます。
途中厳しいことも書きましたが、参考になれば幸いです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 数学 【全微分について】 z=f(x,y) の全微分は df=(∂f/∂x)dx+(∂f/∂y)dy と表 1 2023/02/25 05:49
- 数学 微分(全微分)についての質問です。 2 2022/04/07 17:08
- 数学 (1+x^2)y'=1 の微分で教えて下さい 2 2022/08/30 10:23
- 数学 前にも質問したものでx^3+y^3=1を陰関数を使って、点(1、0)、接線の方程式を求めなさいという 1 2023/07/08 12:17
- 数学 テイラー展開について r↑(x+dx,y+dy,f(x+dx,y+dy))を点(x,y,f(x,y) 4 2023/03/08 01:06
- 数学 「急募!」数学 微分方程式 dy/dx=y+x*y^3 ・・・(1) 但しy(0)=±1をExcel 2 2022/07/20 21:58
- 数学 全微分について質問です。 z=f(x,y)のとき df=(∂f/∂x)dx+(∂f/∂y)dy ∂f 5 2023/02/24 05:46
- 数学 微分方程式の問題 1 2023/07/27 12:11
- C言語・C++・C# ある線が円の範囲に入っているかの計算 1 2022/12/07 16:14
- 物理学 全微分のdx,dyの意味 3 2023/05/26 08:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【JAVA】数字をひし形に出力す...
-
ruby
-
変数の値が勝手に変化する原因
-
Fortran90についての質問です。
-
"n!"(階乗)の数字列の生成
-
プログラミング
-
3つの整数のうち奇数のみを表示...
-
ProC 固定SQLでNULLってどう表...
-
Excelで4096点以上のFFTの方法
-
めちゃきれい
-
Notepad++の関数リスト表示でC...
-
自動クエリとはどういうもので...
-
正しい五十音順について
-
あるプログラムのコマンドライ...
-
0除算して、落ちるプログラムと...
-
65536は2の何乗なのでしょうか?
-
C++ で、「)」が必要 というエ...
-
未使用の変数を一括検索する方法
-
CとFORTRANの計算速度はどちら...
-
インクリメント演算子のみを用...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【JAVA】数字をひし形に出力す...
-
変数の値が勝手に変化する原因
-
JCLの基本について教えてください
-
Sublime Text 3でのFortranプロ...
-
プログラミング
-
fortran if文
-
ruby
-
Fortran90についての質問です。
-
COBOLのピリオド
-
3つの整数のうち奇数のみを表示...
-
main関数終了時のreturnの意味は?
-
360度を超える角度
-
c言語のプログラミング 2つの整...
-
整数格子点を列挙するプログラム
-
N88basicを用いたGPIB制御
-
ProC 固定SQLでNULLってどう表...
-
Fortran "実引数の型が仮引数の...
-
Matlabについて質問2
-
PICのプログラムでsrandを使う...
-
4桁の数値を逆に表示されるプ...
おすすめ情報