Cプログラミング演習 ニュートン法による方程式の求解.

Slides:



Advertisements
Similar presentations
数値解析シラバス C言語環境と数値解析の概要(1 回) C言語環境と数値解析の概要(1 回) 方程式の根(1回) 方程式の根(1回) 連立一次方程式(2回) 連立一次方程式(2回) 補間と近似(2回) 補間と近似(2回) 数値積分(1回) 数値積分(1回) 中間試験(1回) 中間試験(1回) 常微分方程式(1回)
Advertisements

ループで実行する文が一つならこれでもOK
プログラミング論 数値積分
プログラミング論 I 補間
数個、数十個のデータ点から その特徴をつかむ
解析的には解が得られない 方程式を数値的に求める。 例:3次方程式
連立一次方程式 a11x1+a12x2+a13x3+...+a1nxn= b1
1 次方程式 直線   と 軸が交わる点 解ける! 解析的に解ける(解析解)   または 厳密に解ける (厳密解)
基礎プログラミング (第五回) 担当者: 伊藤誠 (量子多体物理研究室) 内容: 1. 先週のおさらいと続き (実習)
IT入門B2 ー 連立一次方程式 ー.
4.2 連立非線形方程式 (1)繰返し法による方法
数値解析シラバス C言語環境と数値解析の概要(1回) 方程式の根(1回) 連立一次方程式(2回) 補間と近似(2回) 数値積分(1回)
湘南工科大学 2013年12月10日 プログラミング基礎1 湘南工科大学情報工学科 准教授 小林 学.
非線形方程式の近似解 (2分法,はさみうち法,Newton-Raphson法)
2008年6月12日 非線形方程式の近似解 Newton-Raphson法
(ラプラス変換の復習) 教科書には相当する章はない
10. 積分 積分・・確率モデルと動学モデルで使われる この章は計算方法の紹介 積分の定義から
誤差の二乗和の一次導関数 偏微分.
第7回 条件による繰り返し.
第2回 Microsoft Visual Studio C++ を使ってみよう
ニュートン法の解の計算 情報電子工学系学科 電気電子工学コース・情報通信システム工学コース
プログラミング演習 バージョン1 担当教員:綴木 馴.
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
関数とポインタ 値呼び出しと参照呼び出し swapのいろいろ 関数引数 数値積分
Cプログラミング演習.
数値積分.
プログラミング論 II 2008年吉日 主成分分析 数値積分
第10回関数 Ⅱ (ローカル変数とスコープ).
Cプログラミング演習 第7回 メモリ内でのデータの配置.
傾きがわかった関数の軌跡を求める. 変数は二つ以上
プログラミング演習I 行列計算と線形方程式の求解
LU分解を用いた連立一次方程式.
高度プログラミング演習 (03).
第7回 条件による繰り返し.
6. ラプラス変換.
プログラミング演習I ―数値解析― 平成16年度 前期 上 村 佳 嗣.
12.数値微分と数値積分.
ルンゲクッタ法 となる微分方程式の解を数値的に解く方法.
8. 高階関数を用いた抽象化 プログラミング論I.
Cの実行モデル.
四則演算,変数 入力文,出力文,代入文, ライブラリ関数
原子動力工学特論 レポート1 交通電子機械工学専攻 齋藤 泰治.
Cプログラミング演習 第10回 二分探索木.
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
2分法のプログラム作成方法 2分法のプログラム(全体構成) プログラム作成要領 2分法のメイン関数(変数宣言)
復習 一定回数を繰り返す反復処理の考え方 「ループ」と呼ぶ false i < 3 true i をループ変数あるいはカウンタと呼ぶ
疑似乱数, モンテカルロ法によるシミュレーション
計算機プログラミングI 第6回 2002年11月14日(木) アルゴリズムと計算量 第1回課題の説明 平方根を計算するアルゴリズム 計算量
連立一次方程式 a11x1+a12x2+a13x3+...+a1nxn= b1
プログラミングⅡ 第2回.
プログラミング入門2 第13回、14回 総合演習 情報工学科 篠埜 功.
情報科学 第6回 数値解析(1).
確率論・数値解析及び演習 (第7章) 補足資料
数値解析 第6章.
13.ニュートン法.
2008年6月5日 非線形方程式の近似解 2分法,はさみうち法,Newton-Raphson法)
ニュートン法による 非線型方程式の解.
cp-15. 疑似乱数とシミュレーション (C プログラミング演習,Visual Studio 2019 対応)
cp-3. 計算 (C プログラミング演習,Visual Studio 2019 対応)
プログラミング演習I 数値計算における計算精度と誤差
3 一次関数 1章 一次関数とグラフ §4 方程式とグラフ         (3時間).
四則演算,変数 入力文,出力文,代入文, ライブラリ関数
ねらい 数値積分を例題に、擬似コードのアルゴリズムをプログラムにする。
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
コンピュータの高速化により, 即座に計算できるようになってきたが, 手法的にはコンピュータ出現以前に考え出された 方法が数多く使われている。
プログラミング言語によっては,複素数が使えない。
9. 再帰のバリエーション (生成的再帰) プログラミング論 I.
プログラミング演習I 補講用課題
8.2 数値積分 (1)どんなときに数値積分を行うのか?
8.数値微分・積分・微分方程式 工学的問題においては 解析的に微分値や積分値を求めたり, 微分方程式を解くことが難しいケースも多い。
Presentation transcript:

Cプログラミング演習 ニュートン法による方程式の求解

ニュートン法による求解

ニュートン法 ニュートン法による非線形方程式 f (x) = 0 の求解 入力:関数 f と, 出力:f (x) = 0 の 近似解の1つ 再帰による繰返し計算により,x1,x2 ... を求める (手順は次ページ) ⇒ 収束すれば,解の近似値が得られる   (注)収束しない場合もありえる

ニュートン法 初期近似値 x0 から出発 反復公式 を繰り返す x1,x2,x3 ... は,徐々に解に近づいていく(と期待できる)

ニュートン法 これは,点(xi, f (xi) )における 接線と, x軸 (y = 0) との交点 (xi+1, 0) を求めている 反復公式 を繰り返す x1,x2,x3 ... は,徐々に解に近づいていく(と期待できる) これは,点(xi, f (xi) )における 接線と, x軸 (y = 0) との交点 (xi+1, 0) を求めている

x3 – 6x2 +11x – 6 x 解 解 解

x 関数上の点 関数上の点を1つ選ぶ

接線 x 接線を引く 関数上の点

接線 接線と x 軸 の交点 x 解の1つ この場合,接線と x 軸の交点は解の1つに近づいている 関数上の点

x 接線 y = f '(x0)(x – x0) + f (x0) 接線と x 軸の交点 関数上の点 から 接線と x 軸の交点の x 座標 (x0 – f (x0)/f '(x0), 0) x 関数上の点       から 接線と x 軸の交点の x 座標 を求めることを繰返す 関数上の点 (x0, f (x0))

x 接線と x 軸の交点 (0.54545454..., 0) x1 = 0.54545454... 関数上の点 (0, – 6)

接線と x 軸の交点 (0.84895321..., 0) x2 = 0.84895321... x 関数上の点 (0.54545454..., – 1.62283996...) x1 = 0.54545454...

接線と x 軸の交点 (0.97467407..., 0) x3 = 0.97467407... x 関数上の点 (0.84895321..., – 0.37398512...) x2 = 0.84895321...

接線と x 軸の交点 (0.99909154..., 0) x3 = 0.999909154... x 関数上の点 (0.97460407..., – 0.052592310...) x3 = 0.97467407...

ニュートン法での収束の判定 ニュートン法では,現在の xi の誤差(どれだけ真の解に近いか)は,正確には分からない (解そのものが分かっていないから) 今日の授業では次の方法で行ってみる ある小さな正の数δに対して となった時点で計算を終了

f (x) 幅2δ x xi の値がこの範囲に入ったら計算を終了

ニュートン法の能力と限界 f (x) 初期近似値 x0 で十分近い解を指定できれば,収束が早い. 1 2 3 x 関数 f (x) が単調でなくて変曲点を持つ (つまり f '(x) の符号が変わる)とき 例)上の図の1から開始   2 (f '(x) = 0となる点)が選ばれる   3 y 軸との交点が求まらない (負の無限大に発散) → 収束しない 収束しないこともありえる (右図)

ニュートン法の注意点 虚数解は求まらない f (x) = 0 の解が複数あっても,1回に求まる解は1つだけ 初期近似値 x0 x0 の値によって,求まる解が変わってくる(f (x) = 0 が複数の解を持つ場合) 求まる解は近似解

例題1.ニュートン法のプログラム f(x)=x2 –2 をニュートン法で解くプログラム

反復公式 収束したかの判定を 行っている部分 #include "stdafx.h" #include <math.h> double f(double x) { return pow(x,2) - 2; } /* f(x)の導関数 */ double g(double x) return 2 * x; int _tmain() double x; double new_x; double delta; int i; int ch; /* 初期値 */ x = 10; /* 収束判定のための delta 値 */ delta = 0.000001; printf("繰り返し回数\tnew_x\t\tf(x)\t\tg(x)\n"); /* for ... になっているのは 100 回繰り返しても収束しなかったら計算を終わりたいから */ for(i = 0 ; i < 100 ; i++) { new_x = x - f(x) / g(x); printf("%2d\t\t%lf\t%lf\t%lf\n",i,new_x,f(x),g(x)); /* fabs は double 型の変数について絶対値を求める関数 */ if( fabs(f(new_x)) < delta ) { printf( "収束した\n" ); printf( "解は %lf\n", new_x); break; x = new_x; printf( "Enter キーを1,2回押してください. プログラムを終了します\n"); ch = getchar(); return 0; 反復公式 収束したかの判定を 行っている部分

実行結果の例

台形則による数値積分

定積分 f(x) x a b 定積分:  区間 [a, b] で,連続関数 f, x軸, x=a, x=b で囲まれた面積

区間 [a, b] の小区間への分割 f(x) x x1 x2 xn-1 x0 = a xn = b n 個の等間隔な小区間に分割 幅: h = (b-a) / n 小区間: [x0, x1], [x1, x2], ..., [xn-1, xn] 但し,x0 = a, xi = x0 + i × h

小台形 f(x) f(xi) f(xi+1) xi xi+1 x x0 = a xn = b 小台形 小台形の面積は

台形則 trapezoidal rule x1 x2 x3 xn-1 xn-2 f(x) x x0 = a xn = b 小台形の面積の和は 定積分 I を,この和 Sn で近似 ⇒ 台形則という

台形則 両端 x0 = a と xn = b を除いて,f(xi) は2度出現 2回現れる部分 但し  h = (b - a) / n

台形則による数値積分 区間[a,b]を n 等分 (1区間の幅h=(b-a)/n) n 個の台形を考え, その面積の和 Sn で,定積分 I を近似 f(x) が連続関数のときは,n を無限大に近づければ,Sn は I に近づく 但し,単純に「n を大きくすればよい」とは言えない n を大きくすると ⇒ 計算時間の問題,丸め誤差の問題が発生