vbaで数値計算 04 ニュートン法

17
2017-01 更新 熊本高専 森下功啓 VBA数値計算04

Upload: katsuhiro-morishita

Post on 13-Apr-2017

149 views

Category:

Education


3 download

TRANSCRIPT

Page 1: VBAで数値計算 04 ニュートン法

2017-01更新 熊本高専森下功啓

VBAで数値計算04

Page 2: VBAで数値計算 04 ニュートン法

本資料の目次

ニュートン法練習問題その他

2

Page 3: VBAで数値計算 04 ニュートン法

ニュートン法 f(x) = 0をxについて解く

3

Page 4: VBAで数値計算 04 ニュートン法

ニュートン法とは、𝑥𝑥軸と関数𝑓𝑓(𝑥𝑥)の交点を求めるアルゴリズム

4

O𝑥𝑥

𝑦𝑦

𝑦𝑦 = 𝑓𝑓 𝑥𝑥 = 0となる座標を求める

𝑓𝑓(𝑥𝑥)

Page 5: VBAで数値計算 04 ニュートン法

ニュートン法のアルゴリズム

5

①𝑥𝑥𝑘𝑘の初期値𝑥𝑥0更新値𝑥𝑥1

②𝑓𝑓 𝑥𝑥0 を計算

③𝑥𝑥0における接線の傾き(==微分値)を求める

④接線とy = 0の交点の𝑥𝑥座標で𝑥𝑥𝑘𝑘を更新

⑤以下、解が収束するまで繰り返す

O𝑥𝑥

𝑦𝑦

Page 6: VBAで数値計算 04 ニュートン法

この戦略で上手くいかないケース

関数の形や初期値によっては発散する事が有ります。ループ回数に制限を付けましょう。

6

O𝑥𝑥

𝑦𝑦 𝑓𝑓(𝑥𝑥)

End Less

*そもそもy=0となる点がない場合も上手くいかない。

Page 7: VBAで数値計算 04 ニュートン法

実装戦略

プログラムをどう組むか考えてみる。

7

①𝑥𝑥𝑘𝑘の初期値𝑥𝑥0更新値𝑥𝑥1

②𝑓𝑓 𝑥𝑥0 を計算

③𝑥𝑥0における接線の傾きを求める

④接線とy = 0の交点の𝑥𝑥座標で𝑥𝑥𝑘𝑘を更新

⑤以下、解が収束するまで繰り返す

O

ループ構造

微分が必要

yが0近傍でループを脱出また、ループ回数の制限で脱出

直線の式ってどんなだったか・・・

接線の式に0を代入してxについて解く

𝑥𝑥

𝑦𝑦

Page 8: VBAで数値計算 04 ニュートン法

実装のイメージ

8

Dim x As DoubleDim y As DoubleDim count As Integer

x = 100y = 100count = 0Do‘ y = f(x)を求める‘ f’(x)を求める‘ 接線のy=0でnew_xを求める。x = new_xcount = count + 1

Loop while y > 0.01 And count < 1000

ループ構造 微分が必要

接線の式に0を代入してxについて解く

yが0近傍でループを脱出また、ループ回数の制限で脱出

@VBA

Page 9: VBAで数値計算 04 ニュートン法

(応用)1変数連立方程式を解く

9

𝑓𝑓 𝑥𝑥 = 𝑔𝑔 𝑥𝑥

𝑓𝑓 𝑥𝑥 − 𝑔𝑔 𝑥𝑥 = 0

ニュートン法を使って2つの方程式が等しい場合の解を求めることができます。移項して片側を0にするのがコツです。

Page 10: VBAで数値計算 04 ニュートン法

別のアプローチ

2分法や最急降下法もf(x)=0の解を求めることができます。これらは計算に時間がかかりますが、発散しません。特に2分法は解があれば必ず求まります。将来、ニュートン法でうまく行かなかったら試してみて下さい。

10

Page 11: VBAで数値計算 04 ニュートン法

練習問題11

Page 12: VBAで数値計算 04 ニュートン法

問1 ニュートン法

ニュートン法を使ってy=0の解となる自明でないxを求めたい。y=ax3+bx2+cx+d=0(係数は任意)を解くプログラムを作成せよ。

12

Page 13: VBAで数値計算 04 ニュートン法

問2 ニュートン法

20 log ax=5上記の式において、係数aを任意としxを求めよ。

13

Page 14: VBAで数値計算 04 ニュートン法

問3 極値

ニュートン法は関数の極値を調べることにも使える。極大値や極小値において微分係数は0であるので、関数の理論微分の式さえ分かれば理論微分式=0と置いてこれをxについて解けば良い。以下の関数の極値をプログラムを用いて求めよ。理論微分は手計算で良い。複数の極がありうることに留意せよ。

14

𝑦𝑦 = 3𝑥𝑥5 + 5𝑥𝑥4 − 7𝑥𝑥3 + 2𝑥𝑥2 − 1𝑥𝑥 + 3

Page 15: VBAで数値計算 04 ニュートン法

チャレンジ問題

(暇ならやってみよう)今、xのn次関数を考える。n次関数はy=anxn+…という形をしている。式で書くと式(1)となる。

15

𝑦𝑦 = �𝑖𝑖=0

𝑛𝑛

𝑎𝑎𝑖𝑖𝑥𝑥𝑖𝑖 式(1)

ここで、係数を配列に入れておくものとする。配列の要素番号が指数を表す。1階微分した関数の係数を計算する関数を実装せよ。

Page 16: VBAで数値計算 04 ニュートン法

その他16

Page 17: VBAで数値計算 04 ニュートン法

参考文献

SAK Streets - VB 開発言語資料 http://sak.cool.coocan.jp/w_sak3/doc/sysbrd/sak3vb.htm 基本的にVB6.0の解説だが、VBAにほぼそのまま適用できる。かなり詳しい。

17