ニュートン法による 非線型方程式の解.

Slides:



Advertisements
Similar presentations
Prog Lec14-1 Copyright (C) 1999 – 2013 by Programming-0 Group プログラミング入門 第1 4 回講義 マークのあるサンプルプログラムは /home/course/prog0/public_html/2013/lec/source/
Advertisements

4章 制御の流れ-3.
プログラミング論 数値積分
数個、数十個のデータ点から その特徴をつかむ
解答 1 複素数を構造体として定義し、二つの複素数の積(結果は複素数)を返す 関数 を定義せよ。
解析的には解が得られない 方程式を数値的に求める。 例:3次方程式
連立一次方程式 a11x1+a12x2+a13x3+...+a1nxn= b1
基礎プログラミング (第五回) 担当者: 伊藤誠 (量子多体物理研究室) 内容: 1. 先週のおさらいと続き (実習)
コンピュータープログラミング (C言語)(6) 1.条件分岐2(switch文、復習) 2.繰り返し処理(for文、while文)
IT入門B2 ー 連立一次方程式 ー.
4.2 連立非線形方程式 (1)繰返し法による方法
数値解析シラバス C言語環境と数値解析の概要(1回) 方程式の根(1回) 連立一次方程式(2回) 補間と近似(2回) 数値積分(1回)
非線形方程式の近似解 (2分法,はさみうち法,Newton-Raphson法)
2008年6月12日 非線形方程式の近似解 Newton-Raphson法
誤差の二乗和の一次導関数 偏微分.
第7回 条件による繰り返し.
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
第2回 Microsoft Visual Studio C++ を使ってみよう
ニュートン法の解の計算 情報電子工学系学科 電気電子工学コース・情報通信システム工学コース
プログラミング演習 バージョン1 担当教員:綴木 馴.
プログラムの制御構造 選択・繰り返し.
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
情報処理演習 (秋学期・樋口担当) 3回目 10/8 日本工業大学 コンピュータリテラシーII.
Cプログラミング演習.
数値積分.
第10回関数 Ⅱ (ローカル変数とスコープ).
基本骨格 #include #include : int main(void) { 変数の宣言 実行すること return 0; } #include int main(void) { int i; printf(”Hello world!\n”);
フーリエ級数展開 ~矩形波について~ 長江 栞 中島 涼 中村 勇樹
プログラミング演習I 行列計算と線形方程式の求解
LU分解を用いた連立一次方程式.
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
第7回 条件による繰り返し.
Cの実行モデル.
四則演算,変数 入力文,出力文,代入文, ライブラリ関数
原子動力工学特論 レポート1 交通電子機械工学専攻 齋藤 泰治.
高度プログラミング演習 (05).
高度プログラミング演習 (05).
関数への道.
PADのテンプレート 処理、連接 x0 ← x x ← x0+ u(x0) err ← |x - x0| 判断(選択) x2 ← x3
PADのテンプレート 処理、連接 x0 ← x x ← x0+ u(x0) err ← |x - x0| 判断(選択) x2 ← x3
2分法のプログラム作成方法 2分法のプログラム(全体構成) プログラム作成要領 2分法のメイン関数(変数宣言)
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
復習 一定回数を繰り返す反復処理の考え方 「ループ」と呼ぶ false i < 3 true i をループ変数あるいはカウンタと呼ぶ
疑似乱数, モンテカルロ法によるシミュレーション
実数列を生成する際の注意 数学関数の利用 Excel によるリサージュ図形描画 Excel による対数グラフ描画
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
プログラミング序論演習.
C言語ファミリー C# 高級言語(抽象的) Java オブジェクト指向 C++ C 機械語(原始的)
連立一次方程式 a11x1+a12x2+a13x3+...+a1nxn= b1
確率論・数値解析及び演習 (第7章) 補足資料
13.ニュートン法.
2008年6月5日 非線形方程式の近似解 2分法,はさみうち法,Newton-Raphson法)
実数列を生成する際の注意 数学関数の利用 Excel によるリサージュ図形描画 Excel による対数グラフ描画
数値解析 平成29年度前期 第4週 [5月1日] 静岡大学 創造科学技術大学院 情報科学専攻 工学部機械工学科 計測情報講座 三浦 憲二郎
cp-15. 疑似乱数とシミュレーション (C プログラミング演習,Visual Studio 2019 対応)
cp-3. 計算 (C プログラミング演習,Visual Studio 2019 対応)
Cプログラミング演習 ニュートン法による方程式の求解.
岩村雅一 知能情報工学演習I 第8回(後半第2回) 岩村雅一
岩村雅一 知能情報工学演習I 第8回(C言語第2回) 岩村雅一
プログラミング演習I 数値計算における計算精度と誤差
Cp-1. Microsoft Visual Studio 2019 C++ の使い方 (C プログラミング演習,Visual Studio 2019 対応) 金子邦彦.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
四則演算,変数 入力文,出力文,代入文, ライブラリ関数
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
コンピュータの高速化により, 即座に計算できるようになってきたが, 手法的にはコンピュータ出現以前に考え出された 方法が数多く使われている。
プログラミング言語によっては,複素数が使えない。
9. 再帰のバリエーション (生成的再帰) プログラミング論 I.
分岐(If-Else, Else if, Switch) ループ(While, For, Do-while)
= 55 課題6-1 #define _CRT_SECURE_NO_WARNINGS
プログラミング 2 静的変数.
Presentation transcript:

ニュートン法による 非線型方程式の解

ニュートン法 方程式f(x)=0の解を求める 処理手順 1. 初期値 x の決定 x = x0 を決める 2. 接線と x 軸の交点の計算 x = x0 における y = f(x) の接線を引き、今度はこの接線と y=0 (x軸)の交点を x1 とする すなわち、 xn+1 = xn - (f(x)/f ’(x)) を計算する 3. 2. を繰り返して値が収束したらそれを解とする

ニュートン法 初期値x=a をとる グラフに接線1を引く 接線1が横軸をきる点x=b aよりも真の値に近くなる bのところで次の接線2を引く Bよりも真の値に近い点 x=cが得られる 同じことを繰り返す 真の値x0に極めて近い値 を得る x0 c b a

ニュートン法の弱点 Newton 法は, 出発点とする十分近い解を見付けることができれば, 非常に収束が早い. 初期値の選び方次第では収束しない 関数f(x)が単調でなくて変曲点を持つ, つまりf’(x)の符号が変わるときには収束しない場合がある 三次以上になるとあまり有効な方法でなくなる. 無限ループが起こる 対策 繰り返しの上限回数を設定する

ニュートン法の弱点 重根の場合、誤差がなかなかゼロに収束しない 収束までに非常に時間がかかる 対策 収束条件を設定する

ニュートン法での収束条件 ニュートン法では現在の xn がどれだけ真の値に近いかは,一般には分からない 収束条件として、ある小さな正の数εに対して            xn+1-xn             xn+1    となった時点で計算を終了し xn+1 を解とする =ε

ニュートン法のプログラム 入力 出力 初期値 x0 計算精度 ε 方程式 f(x) f(x)の導関数 f ’(x) 計算精度 ε 方程式 f(x) f(x)の導関数 f ’(x) 繰り返し回数の上限 number 出力 解(計算過程)

ニュートン法の注意点 初期値をいくつにするか? 収束条件をどうするか? 収束しない場合はどうするか? 虚数解は求まらない 初期値の設定の際、あまりに解と掛け離れた値を与えると、収束するのに時間がかかったり、収束しなかったりする 収束条件をどうするか? どの程度の精度で計算するかを決定していないと,繰り返しをいつ終えるか決まらない 収束しない場合はどうするか? 虚数解は求まらない

例題 ニュートン法のプログラム 初期値,計算精度、繰り返し上限回数を読み込んで,f(x)=x2 –2 をニュートン法で解くプログラムを作成する f(x) = x2 - 2 g(x) = f ’(x) = 2x x : 現在のx new_x : 次のx g(x) が 10 以下なら重解とする -4

#include <stdio.h> #include <math.h> void function(void); double f(double x); double g(double x); /* f(x)の出力 */ void function() { printf("f(x) = pow(x,2) - 2\n"); } /* f(x) */ double f(double x) return pow(x,2) - 2; /* f(x)の導関数 */ double g(double x) return 2 * x;

int main(void) { double x; double new_x; double eps; int number, i; char buf[100]; function(); /* f(x)を表示 */ printf("初期値 : "); fgets(buf, 100, stdin); sscanf(buf,"%lf", &x); printf("計算精度 : "); sscanf(buf,"%lf", &eps); printf("繰り返し上限回数 : "); fgets(buf,100,stdin); sscanf(buf,"%d", &number);

printf("繰り返し回数\tnew_x\t\tf(x)\t\tg(x)\n"); for(i = 0 ; i < number ; i++) { new_x = x - f(x) / g(x); if(fabs(new_x - x) < eps * fabs(new_x)) { printf("x = %lf\n",new_x); break; } printf("%2d\t\t%lf\t%lf\t%lf\n",i,new_x,f(x),g(x)); if(fabs(g(x)) < 1.0e-4){ printf("x = %lf(重解)\n",new_x); x = new_x; if(i == number) printf("繰り返し上限\n");

実行結果の例 f(x) = pow(x,2) - 2 初期値 : 10 計算精度 : 0.000001 繰り返し上限回数 : 10 繰り返し回数 new_x f(x) g(x) 0 5.100000 98.000000 20.000000 1 2.746078 24.010000 10.200000 2 1.737195 5.540947 5.492157 3 1.444238 1.017846 3.474390 4 1.414526 0.085824 2.888476 5 1.414214 0.000883 2.829051 x = 1.414214 f(x) = pow(x,2) - 2 初期値 : 100 計算精度 : 0.000001 繰り返し上限回数 : 10 繰り返し回数 new_x f(x) g(x) 0 50.010000 9998.000000 200.000000 1 25.024996 2499.000100 100.020000 2 12.552458 624.250425 50.049992 3 6.355895 155.564203 25.104916 4 3.335282 38.397397 12.711789 5 1.967466 9.124103 6.670563 6 1.492001 1.870921 3.934931 7 1.416241 0.226067 2.984002 8 1.414215 0.005740 2.832483 9 1.414214 0.000004 2.828430 繰り返し上限