% 不動点反復法の動作サンプル clear all; clc; close all; % 諸パラメータを設定 x = 1.0; % 反復の初期値 tol = 1.0e-6; % |f(x)| < tol となったら止める max_val = 10; % 絶対値がこの値になったら打ち切る xx = [x]; % 近似解のリスト % 不動点反復 while (1) x = g1(x); % 不動点反復の関数;ここを変えて試してみよう xx = [xx x]; % リストに値を追加 if ( abs( f(x) ) < 1.0e-6 ) break; % 許容誤差に到達したら離脱 elseif ( abs( f(x) ) > max_val ) break; % 解が発散傾向ならそれはそれで離脱 end end % 近似解の挙動を表示 plot(xx, 'bo'); hold on; plot([1 length(xx)], [1.23578 1.23578], 'r'); % 真値をプロット plot([1 length(xx)], [0 0], 'r'); % 真値をプロット legend('近似解','真値≒1.23578','真値=0'); xlabel('反復回数'); ylabel('x'); %% 以降,途中で使われるサブルーチン % 解くべき式を定義 function y = f(x) y = x^2 - 2.0 * x + sin(x); % 講義で出した例題;真値は 1.23578くらい,0 end % 反復式の右辺を定義 function y = g1(x) y = (x^2 + sin(x)) / 2.0 ; % 例1 end function y = g2(x) y = 2.0 - sin(x) / x; % 例2( x ≠ 0 ) % この g(x) は x=0 はダメなのだが,やってみると負の初期値からでもうまく動く(0を飛び越して動く) end function y = g3(x) y = sqrt( 2.0 * x - sin(x) ); % 例3 end