解析的には解が得られない 方程式を数値的に求める。 例:3次方程式

Slides:



Advertisements
Similar presentations
情報基礎実習 I (第6回) 木曜4・5限 担当:北川 晃. Stream クラスを用いたファイルの接続 … Dim インスタンス名 As New IO.StreamReader( _ “ ファイルの絶対パス ”, _ System.Text.Encoding.Default) … s = インスタンス名.
Advertisements

数値解析シラバス C言語環境と数値解析の概要(1 回) C言語環境と数値解析の概要(1 回) 方程式の根(1回) 方程式の根(1回) 連立一次方程式(2回) 連立一次方程式(2回) 補間と近似(2回) 補間と近似(2回) 数値積分(1回) 数値積分(1回) 中間試験(1回) 中間試験(1回) 常微分方程式(1回)
次ページに関数の解答例 課題12-1 (問題と解答) 複素数xとして, 実部を入力してください.10 虚部を入力してください.20
プログラミング演習(1組) 第7回
4章 制御の流れ-3.
プログラミング論 数値積分
数個、数十個のデータ点から その特徴をつかむ
解答 1 複素数を構造体として定義し、二つの複素数の積(結果は複素数)を返す 関数 を定義せよ。
第12回構造体.
プログラミング入門2 第10回 構造体 情報工学科 篠埜 功.
連立一次方程式 a11x1+a12x2+a13x3+...+a1nxn= b1
P129 モンテカルロ シミュレーション 乱数を使ったシミュレーション.
C言語 配列 2016年 吉田研究室.
基礎プログラミング (第五回) 担当者: 伊藤誠 (量子多体物理研究室) 内容: 1. 先週のおさらいと続き (実習)
コンピュータープログラミング (C言語)(6) 1.条件分岐2(switch文、復習) 2.繰り返し処理(for文、while文)
IT入門B2 ー 連立一次方程式 ー.
4.2 連立非線形方程式 (1)繰返し法による方法
数値解析シラバス C言語環境と数値解析の概要(1回) 方程式の根(1回) 連立一次方程式(2回) 補間と近似(2回) 数値積分(1回)
2008年6月12日 非線形方程式の近似解 Newton-Raphson法
第7回 条件による繰り返し.
情報基礎及び演習 プログラミング基礎① 電気・佐藤亮一.
ニュートン法の解の計算 情報電子工学系学科 電気電子工学コース・情報通信システム工学コース
繰り返し計算 while文, for文.
プログラミング演習 バージョン1 担当教員:綴木 馴.
プログラムの制御構造 選択・繰り返し.
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
関数とポインタ 値呼び出しと参照呼び出し swapのいろいろ 関数引数 数値積分
繰り返し計算 while文, for文.
関数と配列とポインタ 1次元配列 2次元配列 配列を使って結果を返す 演習問題
数値積分.
関数の定義.
第10回関数 Ⅱ (ローカル変数とスコープ).
フーリエ級数展開 ~矩形波について~ 長江 栞 中島 涼 中村 勇樹
傾きがわかった関数の軌跡を求める. 変数は二つ以上
プログラミング入門2 第2回 型と演算 条件分岐 篠埜 功.
高度プログラミング演習 (03).
第7回 条件による繰り返し.
第9回関数Ⅰ (簡単な関数の定義と利用) 戻り値.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
復習 前回の関数のまとめ(1) 関数はmain()関数または他の関数から呼び出されて実行される.
高度プログラミング演習 (08).
プログラミング演習I ―数値解析― 平成16年度 前期 上 村 佳 嗣.
コンピュータープログラミング (C言語)(5) 1.条件分岐1(if文、復習) 2.条件分岐2(switch,case文)
関数への道.
プログラムの制御構造 配列・繰り返し.
プログラミング言語論 第四回 理工学部 情報システム工学科 新田直也.
PADのテンプレート 処理、連接 x0 ← x x ← x0+ u(x0) err ← |x - x0| 判断(選択) x2 ← x3
PADのテンプレート 処理、連接 x0 ← x x ← x0+ u(x0) err ← |x - x0| 判断(選択) x2 ← x3
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
2分法のプログラム作成方法 2分法のプログラム(全体構成) プログラム作成要領 2分法のメイン関数(変数宣言)
疑似乱数, モンテカルロ法によるシミュレーション
連立一次方程式 a11x1+a12x2+a13x3+...+a1nxn= b1
IF文 START もしも宝くじが当たったら 就職活動する 就職活動しない YES END NO.
復習 Cにおけるループからの脱出と制御 break ループを強制終了する.if文と組み合わせて利用するのが一般的. continue
確率論・数値解析及び演習 (第7章) 補足資料
13.ニュートン法.
2008年6月5日 非線形方程式の近似解 2分法,はさみうち法,Newton-Raphson法)
ニュートン法による 非線型方程式の解.
数値解析 平成29年度前期 第4週 [5月1日] 静岡大学 創造科学技術大学院 情報科学専攻 工学部機械工学科 計測情報講座 三浦 憲二郎
cp-15. 疑似乱数とシミュレーション (C プログラミング演習,Visual Studio 2019 対応)
Cプログラミング演習 ニュートン法による方程式の求解.
岩村雅一 知能情報工学演習I 第10回(後半第4回) 岩村雅一
PADのテンプレート 処理、連接 x0 ← x x ← x0+ u(x0) err ← |x - x0| 判断(選択) x2 ← x3
コンピュータの高速化により, 即座に計算できるようになってきたが, 手法的にはコンピュータ出現以前に考え出された 方法が数多く使われている。
プログラミング言語によっては,複素数が使えない。
C言語講座 四則演算  if ,  switch 制御文.
プログラミング演習I 補講用課題
8.2 数値積分 (1)どんなときに数値積分を行うのか?
= 55 課題6-1 #define _CRT_SECURE_NO_WARNINGS
8.数値微分・積分・微分方程式 工学的問題においては 解析的に微分値や積分値を求めたり, 微分方程式を解くことが難しいケースも多い。
Presentation transcript:

解析的には解が得られない 方程式を数値的に求める。 例:3次方程式 方程式の数値解析 解析的には解が得られない 方程式を数値的に求める。 例:3次方程式 f(x) = x3 + x1 - 1 = 0

電卓を用いて f(x) = x3 + x - 1 = 0 f(0) = - 1.0 f(1) = 1.0 f(0.5) = - 0.375 0.75 0.5 1

右にいくか,左に行くかはどうやって判断するか? 電卓を用いて f(x) = x3 + x - 1 = 0 右にいくか,左に行くかはどうやって判断するか? ある幅に達したとき終了 0.5 1

2分法 関数が負と正となる間に必ず解が有る。 f(a)* f(b)<0 x y a b f(a) f(b)

中点の関数値を求める。 f(a)*f(c)<0 a-c 間に解 y f(c) f(b) a x x c b f(a)

中点cを新たに端点bとする。 f(a)*f(b)<0 a-b 間に解 y f(b) a x x c b f(a)

x y a b f(a) f(c) x y a b f(b) f(c) f(c) f(a)*f(c)<0 b ← c a ← c スタート f(c) Yes No f(a)*f(c)<0 b ← c a ← c Yes No |b-a|<e x = c

テキストのプログラム #include <stdio.h> #include <math.h> #define EPS .0001 double nibun(double,double); double func_y(double); int main() { return 0; } Cプログラムの開始 数学関数を利用 数値の設定 関数定義(内容は プログラム後に記載) メインプログラム

メインプログラム double a=0.0, b=1.0; double x; printf("x^3 + x -1\n"); printf("%6.3lf\n",a); printf("%6.3lf\n",b); x = nibun(a,b); printf("%6.3lf\n",x); 初期値 変数の定義 説明文 初期値の出力 二分割の関数プログラムへ 結果の出力

二分割関数プログラム double nibun(double a, double b) { double c; do{ c=(a+b)/2.0; if((func_y(c)*func_y(a))<0) b=c; else a=c; }while(fabs(a-b)>EPS); return(c); } 関数名,引数 変数の定義 繰り返し計算 中点の計算 判定式 終了の判定 結果の出力

関数の定義 例:f(x) = x3 + x - 1 double func_y(double x) { return(pow(x,3)+x-1.0); }

例題 関数: f(x) = x3 + 6x2 + 21x +32 =0 初期値: a = -5 b = -1 関数: f(x) = x sin x -1 =0 初期値: a = 1 b = 2

解 3次関数の例 X = -2.638 三角関数の例 X = 1.114

収束判定について c = 0.0012345のとき fabs(b-a) < 0.0001 a b c = 0.0123??? ある幅に達したとき終了 c = 0.0012345のとき fabs(b-a) < 0.0001 a b c = 0.0123??? fabs((b-a)/c) < 0.0001 c = 0.012345??

収束判定の改善 double nibun(double a, double b) { double c; do{ c=(a+b)/2.0; if((func_y(c)*func_y(a))<0) b=c; else a=c; }while(fabs((a-b)/c)>EPS); return(c); } 関数名,引数 変数の定義 繰り返し計算 中点の計算 判定式 終了の判定 結果の出力

二分法の注意点 二つの初期値に対して, 関数が正負反転していること.

ニュートン法 関数の傾き(微係数)を用いて求析。 y = f’(x0)(x-x0) + f(x0) y f(x0) x x0 x1 = x0 - f(x0)/f’(x0)

ニュートン法 y x x3 x2 x1 x0

xi+1 = xi - f(xi)/f’(xi) xi ← xi+1 |xi+1-xi|<e x = xi+1 スタート x0 y x No x0 y x x2 x1 Yes x = xi+1

多項式の例 y(x) = x3 + x‐1 =0 の解をニュートン法で求めよ。

テキストのプログラム #include <stdio.h> #include <math.h> #define EPS .0001 double func_y(double); double func_z(double); int main() { return 0; } Cプログラムの開始 数学関数を利用 数値の設定 関数定義 導関数の定義 メインプログラム

c = a - func_y(a)/func_z(a); if(fabs(a-c)>=EPS) a=c; else break; } double a=1.0; double c; while(1) { c = a - func_y(a)/func_z(a); if(fabs(a-c)>=EPS) a=c; else break; } printf("近似式x=%6.3lf\n",c); 初期値 変数の定義 ()内が条件を満足しないか,0で停止 次の値 終了の判定 結果の出力

double func_y(double x) { return(pow(x,3.0) + x - 1.0); } double func_z(double x) return(3.0*pow(x,2.0) + 1.0); 関数 導関数

章末問題 y = x ln x – 1 = 0 の解をニュートン法で求めよ。 ln x → log(x)

double func_y(double x) { return(x*log(x) - 1.0); } double func_z(double x) return(log(x) + 1.0); 関数 導関数

別の収束判定法 xi+1 = xi - f(xi)/f’(xi) xi ← xi+1 |f(xi+1)|<e x = xi+1 スタート xi+1 = xi - f(xi)/f’(xi) xi ← xi+1 |f(xi+1)|<e No x0 y x x2 x1 Yes x = xi+1

ニュートン法の注意点 初期値によっては,予想外の解が出る. y a0 x x0

の複素解をニュートン・ラフソン法で求める。 複素数の解を求める f(z) = z3 + 6 z2 + 21 z +32 = 0 の複素解をニュートン・ラフソン法で求める。 二次元ニュートン・ラフソン法

z = x + yi とおく z3 + 6 z2 + 21 z +32 =0 =(x+yi)3+6(x+yi)2+21(x+yi)+32 (x3+3x2yi-3xy2-y3i)+6(x2-2xyi-y2)+21(x+yi)+32=0 (x3-3xy2+6x2-y2+21x+32)+(3x2y-y3+12xy+21y)i=0 実数部 虚数部 f(x, y)= g(x, y)= x3-3xy2+6x2-y2+21x+32=0 3x2y-y3+12xy+21y=0

f(x,y) = f(x0,y0) + ―――――― (x-x0) + ―――――― (y-y0) dx dy = 0 df(x0,y0) df(x0,y0) f(x,y) = f(x0,y0) + ―――――― (x-x0) + ―――――― (y-y0) dx dy = 0 x y f(x,y) f(x0,y0) f(x,y)=0 f(x,y)

f(x,y) = f(x0,y0) + ―――――― (x-x0) + ―――――― (y-y0) = 0 dx dy df(x0,y0) df(x0,y0) f(x,y) = f(x0,y0) + ―――――― (x-x0) + ―――――― (y-y0) = 0 dx dy dg(x0,y0) dg(x0,y0) g(x,y) = g(x0,y0) + ―――――― (x-x0) + ―――――― (y-y0) = 0 dx dy x y f(x,y) f(x0,y0) (a,b) f(x,y)=0 g(x,y)

{f(x1,y1)}2+{g(x1,y1)}2<e2 df(x0,y0) dg(x0,y0) df(x0,y0) dg(x0,y0) J0 = ―――― ―――― - ―――― ―――― dx dy dy dx スタート dg(x0,y0) df(x0,y0) x1 = x0 - {f(x0,y0) ――――― - g(x0,y0) ―――――}/J0 dy dy df(x0,y0) dg(x0,y0) y1 = y0 - {g(x0,y0) ――――― - f(x0,y0) ―――――}/J0 x0 ← x1 y0 ← y1 {f(x1,y1)}2+{g(x1,y1)}2<e2 No Yes x ← x1 y ← y1

の複素解をニュートン・ラフソン法で求める。 複素数の解を求める y = x3 + 6.0 x2 + 21 x +32 の複素解をニュートン・ラフソン法で求める。 複素変数を用いて!

#include <stdio.h> #include <math.h> #include <complex.h> double _Complex f(double _Complex x) { return ((x +6.0)*x + 21.0)*x +32.0; } double _Complex fd(double _Complex xd) return (3.0*xd + 12.0)*xd +21.0; int main(void) 複素数のため 複素数の定義 導関数

double _Complex x0,x1; x0 = -1.0 + 1.0*I; cabs(x0) creal(x0)→実数部 cimag(x0)→虚数部

if(cabs(f(x1)) < eps){break;} x0 = x1; } double _Complex x0, x1; double eps = 1.0e-6; int i, n = 10000; x0 = -1.0 + 2.0*I; for(i = 0; i < n; i ++){ x1 = x0 - f(x0)/fd(x0); if(cabs(f(x1)) < eps){break;} x0 = x1; } printf(“x=%f+%fi\n”,creal(x1),cimag(x1)); return 0; 初期値 複素数の絶対値 複素数の実部 複素数の虚部