二分法とニュートン法について、どのようにプログラムを書けばいいのでしょうか?
具体的には、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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
変数の値が勝手に変化する原因
-
JCLの基本について教えてください
-
Fortran90についての質問です。
-
AVRのC言語について幾つか教え...
-
方対数グラフを書く為の計算方...
-
正しい五十音順について
-
PICマイコンのコピー(クローン...
-
Excelで4096点以上のFFTの方法
-
Javaで2の0乗から-8乗まで表示...
-
65536は2の何乗なのでしょうか?
-
VBAで仕様書は書きますか?
-
未使用の変数を一括検索する方法
-
exeファイルしかないプログラム...
-
VBAにてメール作成した際、一部...
-
0除算して、落ちるプログラムと...
-
C言語で、文字をbmp形式の画像...
-
アプリのプログラムを見るには...
-
VBAでユーザーフォームが自動的...
-
あるプログラムのコマンドライ...
-
0x0000ffffLの"L"って・・・
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数の値が勝手に変化する原因
-
Fortran90についての質問です。
-
Matlabについて質問2
-
【JAVA】数字をひし形に出力す...
-
fortran if文
-
JCLの基本について教えてください
-
Sublime Text 3でのFortranプロ...
-
ProC 固定SQLでNULLってどう表...
-
COBOLのピリオド
-
4桁の数値を逆に表示されるプ...
-
360度を超える角度
-
main関数終了時のreturnの意味は?
-
3つの整数のうち奇数のみを表示...
-
Fortran "実引数の型が仮引数の...
-
c言語のプログラミング 2つの整...
-
exitってどう使うの?
-
HeapDestroyを安全に行う方法
-
"n!"(階乗)の数字列の生成
-
PICのプログラムでsrandを使う...
-
fortranについて
おすすめ情報