GSL Shell:非線形1変数方程式の求解モジュール自作

2017-06-21 :  PCクリニック
Python、C言語、Perl、グルコサミン、Firefox
前(2017-06-19)の記事「GSL Shell 学習:Solve(Findroot)」では、
  ・・・・・
  ・・・・・
  つまり、
    求めたい方程式と、それの導関数と、初期推定値(1つ)
  で始まり、
    漸化式を順次計算し、収束を判定して、
  終了する。
  ・・・・・
  ・・・・・
と云ったソルバーのコードが出来た。


そこで、
若干の改良を加えて、モジュール化してみた。


改良点は:
 解きたい方程式と、初期推定値のみを与えて、
 導関数は、モジュール内部で 差分による近似で置き換える。
と云うもの。
序でに、反復回数も見える化してみた。

で、
(仮称だが)NL_solve_1var.luaモジュールは:
----- NL_solve_1var.lua -----
local M = {}

function M.solve(f,i)
local delta = 10^-8
local df = |x| (f(x+delta)-f(x))/delta -- 導関数の代わり
local x = i; local x2, nn
for n=1,100 do
x2 = x - f(x) / df(x)
if math.abs(x2-x) < delta then break end -- 収束判定
x = x2; nn = n
end
return x, nn -- 戻り値は、解と反復回数?
end

return M
で良い?
反復回数は、最大 100 回で十分だと思う。
収束判定用の微少値は 10^-8 で十分ダ。

このモジュールを使うテストメイン:
----- test_Main_NL_solve_1var.gsl -----
f = |x| math.cos(x) - x -- 対象関数
x = 2 -- 初期推定値
----------------------------
NL = require'NL_solve_1var'
x, n = NL.solve( f, x ) -- 求めた根 と、反復回数

print( n, x ) -- 3, 0.73908513321985
これで?
OKですネ。


本日はここまで。


Lua ( GSL Shell ) 学習は続く。


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


170507,10
関連記事
スポンサーサイト

コメントの投稿

管理者にだけ表示を許可する

おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
06 | 2017/07 | 08
- - - - - - 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 31 - - - - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

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

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


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

Google Analytics
ブックマーク