(1)「電気・電子工学のための数値計算法入門」橋本修著 総合電子出版社
(2)「ディジタル信号処理技術」玉井徳みち、長島厚、藤田泰弘、若井修造著 日経BP社
(3)「よくわかる有限要素法」福森栄次著 Ohmsha
http://szksrv.isc.chubu.ac.jp/java/physics/rlc/rlc0.html
http://www.asahi-net.or.jp/~jk2m-mrt/kiso_RLC.htm
http://ja.wikipedia.org/wiki/%E4%B8%89%E8%A7%92%E9%96%A2%E6%95%B0
http://www.cmplx.cse.nagoya-u.ac.jp/~furuhashi/education/CircuitMaker/chap1.pdf
http://www.akita-nct.ac.jp/~yamamoto/lecture/2003/5E/lecture_5E/diff_eq/node2.html
http://chemeng.on.coocan.jp/cemath/cemath08.html
http://homepage3.nifty.com/skomo/f6/hp6_3.htm
http://homepage1.nifty.com/gfk/rungekutta.htm
(a) 微分の説明
微分方程式の解を求める
(b) 微分方程式の解を数値計算で求める
(c) 積分の説明
(d) 関数が微分の形の形で表されているときの積分値を求める
(一般的に数値積分をする意味は、関数自体が変化の式(例えば速度の関数)などで表されているとき
ある時刻から時刻までの距離を求めたいときなどで使用される。
もちろんその変化の式が、手計算によって計算可能ならば積分によって時間と距離の関係を導出し
その時間を入れることで直接距離を導いたほうが早い。
しかし、一般的に時間と距離の関係のような式自体が導出することが不可能な場合が世の中には多く
時間と速度の関係のような変化の式を見つけ出すことの方が容易なのだが、これを手計算で積分すること
は非常に難しいため数値積分が提案された)
微分や積分をコンピュータで解く場合、連続(アナログ)な現象を不連続(ディジタル)な現象として解く必要がある。
連続モデル 不連続モデル 微分 差分 積分 和分
数値解法におけるある点xでの微分を求める方法は1つしかない。
微分方程式の解を求めることと、たんに微分を求めることとは区別すること。
ここでは微分の方法だけを示し、微分方程式の解を求めることは
オイラー、テイラー、ルンゲクッタ法で説明する。
ここでは数値微分における差分の方法をプログラム交えて説明する。
ある連続関数,
において、区間[a,b]をn等分し、その間隔を
とする。
このように定義すると、第1差分と第2差分は次のように表される。
○第1差分
○第2差分
この考え方を一般化すると、第n差分は以下のようになる。
ここで、
となるオペレータKを導入すると、
微分オペレータ を導入して差分を表すと、
(式1-1)
となる。ここで、に対してテーラー展開すると
(マクローリン展開)
となる。ここで
ゆえに
(式1-2)
が導出される。
さらに、(式1-2)は、
(式1-2)
だから、この式の両辺のを取ると、
(式1-3)
この式をテーラー展開すると、
(の階乗は非常に小さいので)
また、式(1-3)を2乗すると
となり、これを用いてyに関する2次の微分は次のように求められる。
(式1-4)
となる。
ある連続関数,
において、区間[a,b]をn等分し、その間隔を
とすると
1階差分および2階差分は
となる。
また、中心差分における1階差分は、
となる。
手計算で
なので、のときは、
// bibun_method.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 // #include "stdafx.h" #include<iostream> #include<fstream> #include<io.h> //y=x^3のx=2における微係数を求める double func1(double x); double bibun1a(double (*function)(double x),double x,double h); double bibun1b(double (*function)(double x),double x,double h); double bibun2a(double (*function)(double x),double x,double h); int _tmain(int argc, _TCHAR* argv[]) { errno_t err; FILE *fp_output; double x =3.; double diff1=0,ans1=0,diff2=0,ans2=0; if( err = fopen_s(&fp_output,"bibun_data.txt","w") != 0){ exit(2);} for(float h=0.01;h<=1.;h=h+0.01){ //1次微分その1 double ans1=bibun1a(&func1,x,h); double ans1b=bibun1b(&func1,x,h); //2次微分 double ans2=bibun2a(&func1,x,h); printf("x = %f\n",x); printf("微小区間(h) = %f\n",h); printf("1階微分(前進差分) = %f\n",ans1); printf("1階微分(中心差分) = %f\n",ans1b); printf("2階微分(前進差分) = %f\n",ans2); fprintf_s(fp_output,"%f %f %f %f\n",h,ans1,ans1b,ans2); } if(fp_output != NULL) fclose(fp_output); getchar(); return 0; } double bibun1a(double (*function)(double x),double x,double h){ double diff1a=(*function)(x+h)-(*function)(x); double ans=diff1a/h; return ans; } double bibun1b(double (*function)(double x),double x,double h){ double diff1b=(*function)(x+h)-(*function)(x-h); double ans=diff1b/(2*h); return ans; } double bibun2a(double (*function)(double x),double x,double h){ double diff2a=(*function)(x+2*h)-2.0*(*function)(x+h)+(*function)(x); double ans=diff2a/(h*h); return ans; } double func1(double x){ double y; y=(x*x*x); return y; }
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 微分を実行する % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% echo off clear all close all load 'bibun_data.txt' h=bibun_data(:,1); b1a=bibun_data(:,2); b1b=bibun_data(:,3); b2a=bibun_data(:,4); num=ones(size(h)); b1_real=num.*27.0; b2_real=num.*18.0; semilogx(h,b1a,'ro','linewidth',2); hold on semilogx(h,b1b,'mo','linewidth',2); hold on semilogx(h,b2a,'bo','linewidth',2); hold on semilogx(h,b1_real,'r-','linewidth',2); hold on semilogx(h,b2_real,'b-','linewidth',2); hold on grid on %x軸を逆にする set(gca,'XDir','reverse'); set(gca,'XTick',[0.01 0.1 1.0]) set(gca,'XTickLabel',{'0.01','0.1','1.0'}) xlabel('微小区間(h)','Fontsize',18) ylabel('微係数','Fontsize',18) title('x=3におけるx^3の1,2次微分','Fontsize',18) h=legend('1次微分(前進差分)',..., '1次微分(中心差分)',..., '2次微分(前進差分)',..., '1次微分(理論)',..., '2次微分(理論)',..., 3); set(h,'FontSize',15) axis([0.01 0.1 15 30]); h=gca get(h) set(h,'LineWidth',2,..., 'FontSize',18) print -djpeg suuti_bibun_byouga.jpg