GSL Shell 学習:Solve(Findroot)

2017-06-19 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
2年前(2015-11-27)の記事「Python 学習:scipy.optimize.fsolve」では、
機能豊富な Python の、scipy.optimize.fsolve を使って、
  2*cos(x)-exp(x)=0
なる、非線形方程式の数値解(根?)を求めるコトが出来た。

これでは、
対象とする式の定義と、根の初期推定値(1つ)を与える。


これまでで、GSL Shell ( Lua ) で出来たのは、
Lua Solve」の如く、

1.上記の Python モジュールを(LuaPy経由で)使う

2.昨年6月(2016-06-24)の記事「SciLua:Solve」方式

3.昨年7月(2016-07-06)の記事「Solve:二分法」方式


今回、GSL Shell ( Lua ) から直接、
scipy.optimize.fsolve 相当の方式が出来ないか?

探してみたがなさそう。


そこで、
ソルバーを自作するとして、アルゴリズムを検索してみた。

“Qiita”の「ニュートン法とは何か??ニュートン法で解く方程式の近似解

“講義資料”「非線型方程式の数値計算法
等々が見つかる。

“講義資料”の“3 二分法(bisection method)”じゃなくて、
4 ニュートン法(Newton's method)”を使ってみた。

キモは、資料の 式(13) ですね。

  ・・・・・
  ・・・・・
  となる。
  これで,x_i から x_{i+1} が計算できる.これをニュートン法の漸化式と言う.
  この漸化式を用いれば,次々とより精度の良い近似解を求めることができる.
  計算の終了は,
  ・・・・・
  ・・・・・


つまり、

  求めたい方程式と、それの導関数と、初期推定値(1つ)

で始まり、

  漸化式を順次計算し、収束を判定して、

終了する。

と云うこと。


それで、
昨年6月(2016-06-24)の記事で書いた式:
----- 以上省略 -----
------------------------------------------
----- おまけに、一寸複雑(?)な式

function g(x) return math.cos(x)-x end

x = root.ridders( g, 0, 1.5, stp )
print( x ) -----> 0.73908513026639
に対して、
コーディングしてみた。
----- test_blog_2355.gsl
g = |x| math.cos(x) - x -- 対象方程式
dg= |x| -math.sin(x) - 1 -- 導関数
x = 1.5 -- 初期推定値
-------------- 反復処理
while true do
x2 = x - g(x) / dg(x) -- 上記の式(13)
if math.abs(x2-x) < 10^-8 then break end -- 収束判定
x = x2
end
----- 解:
print( x ) -----> 0.73908513321516
出来ました。


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


170506
スポンサーサイト
おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
05 | 2017/06 | 07
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク