ニュートン法の解の計算 情報電子工学系学科 電気電子工学コース・情報通信システム工学コース

Slides:



Advertisements
Similar presentations
オブジェクト指向言語・ オブジェクト指向言語演習 中間試験回答例. Jan. 12, 2005 情報処理技術基礎演習 II 2 オブジェクト指向言語 中間試験解説 1  (1) 円柱の体積(円柱の体積 = 底面の円の面積 x 高さ) を求めるプログラムを作成しなさい。ただし、出力結果は、入 力した底面の円の半径.
Advertisements

配列の宣言 配列要素の初期値 配列の上限 メモリ領域 多次元配列 配列の応用
次ページに関数の解答例 課題12-1 (問題と解答) 複素数xとして, 実部を入力してください.10 虚部を入力してください.20
情報基礎演習B 後半第5回 担当 岩村 TA 谷本君.
数理情報工学演習第一C プログラミング演習 (第3回 ) 2014/04/21
グラフ描画ソフト gnuplot を体験してみよう
配列(2) 第10回[平成15年6月26日(木)]:PN03-10.ppt 今日の内容 1 素数を求める(教科書の例):復習
解析的には解が得られない 方程式を数値的に求める。 例:3次方程式
連立一次方程式 a11x1+a12x2+a13x3+...+a1nxn= b1
基礎プログラミング (第五回) 担当者: 伊藤誠 (量子多体物理研究室) 内容: 1. 先週のおさらいと続き (実習)
4.2 連立非線形方程式 (1)繰返し法による方法
アルゴリズムとデータ構造 補足資料6-3 「サンプルプログラムcat3.c」
数値解析シラバス C言語環境と数値解析の概要(1回) 方程式の根(1回) 連立一次方程式(2回) 補間と近似(2回) 数値積分(1回)
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
演習問題の答え #include #include #define NUM 5 typedef struct { // 構造体の定義 float shincho; // 身長 float taiju; // 体重 } shintai; void hyouji(shintai.
グラフ描画ソフト gnuplot を体験してみよう
第7回 条件による繰り返し.
第2回 Microsoft Visual Studio C++ を使ってみよう
アーランの即時式モデル.
プログラミング演習 バージョン1 担当教員:綴木 馴.
岩村雅一 知能情報工学演習I 第11回(後半第5回) 岩村雅一
プログラミング論 ファイル入出力
関数とポインタ 値呼び出しと参照呼び出し swapのいろいろ 関数引数 数値積分
関数と配列とポインタ 1次元配列 2次元配列 配列を使って結果を返す 演習問題
Cプログラミング演習.
第10回関数 Ⅱ (ローカル変数とスコープ).
iioLoadFile()とiioMallocImageBuffer()の補足
iioLoadFile()とiioMallocImageBuffer()の補足
iioLoadFile()とiioMallocImageBuffer()の補足
フーリエ級数展開 ~矩形波について~ 長江 栞 中島 涼 中村 勇樹
プログラミング演習I 行列計算と線形方程式の求解
LU分解を用いた連立一次方程式.
今までの練習問題の復習.
第7回 条件による繰り返し.
第10回 FIR回路とIIR回路.
プログラミング論 ファイル入出力
Cの実行モデル.
関数の再帰呼び出しとは ハノイの塔 リダイレクト レポート課題
プログラムの制御構造 配列・繰り返し.
プログラミング言語論 第四回 理工学部 情報システム工学科 新田直也.
2005年度 データ構造とアルゴリズム 第6回 「ハッシュ法を用いた探索」
2分法のプログラム作成方法 2分法のプログラム(全体構成) プログラム作成要領 2分法のメイン関数(変数宣言)
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
疑似乱数, モンテカルロ法によるシミュレーション
実数列を生成する際の注意 数学関数の利用 Excel によるリサージュ図形描画 Excel による対数グラフ描画
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
プログラミング序論演習.
プログラミング序論演習.
プログラミング演習I 2003年4月30日(第3回) 木村巌.
連立一次方程式 a11x1+a12x2+a13x3+...+a1nxn= b1
IF文 START もしも宝くじが当たったら 就職活動する 就職活動しない YES END NO.
プログラミングⅡ 第2回.
復習 Cにおけるループからの脱出と制御 break ループを強制終了する.if文と組み合わせて利用するのが一般的. continue
11.1 標準ライブラリ関数 11.2 関数呼び出しのオーバーヘッド 11.3 大域変数 11.4 プロトタイプ宣言 11.5 関数引数
ニュートン法による 非線型方程式の解.
実数列を生成する際の注意 数学関数の利用 Excel によるリサージュ図形描画 Excel による対数グラフ描画
ループだよ!難しいよ! 第5章 while(ループ);.
cp-15. 疑似乱数とシミュレーション (C プログラミング演習,Visual Studio 2019 対応)
cp-3. 計算 (C プログラミング演習,Visual Studio 2019 対応)
Cプログラミング演習 ニュートン法による方程式の求解.
Cp-1. Microsoft Visual Studio 2019 C++ の使い方 (C プログラミング演習,Visual Studio 2019 対応) 金子邦彦.
C言語プログラミング・課題 ファイルを読み込んで、その内容を表示するプログラムを作成せよ。
システムプログラミング 第11回 シグナル 情報工学科  篠埜 功.
プログラミング入門2 第5回 配列 変数宣言、初期化について
情報処理概論Ⅰ 2007 第11回 2007/7/4 情報処理概論Ⅰ 第11回.
プログラミング入門2 第3回 条件分岐(2) 繰り返し文 篠埜 功.
第14章 ファイル操作 14.1 ファイルへの書き込み 14.2 ファイルからの読み込み 14.3 ファイルへの追加書き込み
復習 いろいろな変数型(2) char 1バイト → 英数字1文字を入れるのにぴったり アスキーコード → 付録 int
知能情報工学演習I 第10回( C言語第4回) 課題の回答
= 55 課題6-1 #define _CRT_SECURE_NO_WARNINGS
Presentation transcript:

ニュートン法の解の計算 情報電子工学系学科 電気電子工学コース・情報通信システム工学コース 10024061 小林 祐樹 10024074 佐藤 景治 10024075 佐藤 建甫 10024077 佐藤 宣 

はじめに 今回の課題内容 プログラムの製作①(ソースコード<生成部>) プログラムの製作②(ソースコード<可視部>) 計算結果 アクティビティ図(データフロー) フローチャート グラフへの可視化 今回の課題の考察

課題内容 出力 数値&表示用ファイルを表示 出力に変換 ニュートン法による数値計算 プログラム入力 方程式を入力する

プログラムの製作①ソースコード<生成部> #include <stdio.h> #include <stdlib.h> #include <math.h> #define max 1000 #define eps 1.0e-5 #define F x*x-10*x+25 #define DF 2*x-10 double f(double x); double df(double x); void save(int c,double d[max]); int main() { int count,i,j=0; double a,newa,b[max]; FILE *fp; count=0; printf("ニュートン法を用いてf(x)=0の解を求めます。\n"); printf("初期値を入力してください。\n"); scanf("%lf",&a); b[0]=a; for(;;) { count++; newa=a-f(a)/df(a); b[count]=newa; if(fabs(newa-a)<eps) break; a=newa; if(count==max) { printf("収束しませんでした\n"); exit(1);} }

ソースコード②<生成部> printf("解の値は%f\n収束するのに%d回かかりました。\n", newa,count); printf("計算過程を以下に示します。\n"); for(i=0;i<count+1;i++) { printf("x[%d] %f\n",i,b[i]);} save(count,b); return 0;} double f(double x) {return F;} double df(double x) { return DF;} void save(int c, double d[max]) { int i,j=0,k=0; double h[max],l[max]; char a[3]="\n" ; FILE *fp;

ソースコード③<生成部> if( (fp=fopen( "z1.dat","wb"))==NULL) { fprintf(stderr,"ファイルを作成できません。\n"); exit(1);} for(i=0;i<d[0]+1;i++) {fwrite(&d[i],sizeof(double),1,fp); fwrite( &j,sizeof(int),1,fp);} { h[i]=f(-d[0]+i); fwrite(&h[i],sizeof(double),1,fp);} for(i=1;i<d[0]+1;i++) {h[i]=f(i); fwrite(&h[i],sizeof(double),1,fp); } for(i=0;i<c+1;i++) { l[i]=f(d[i]); fwrite(&l[i],sizeof(double),1,fp);} fclose(fp);}

出力結果 ニュートン法を用いてf(x)=x*x-10*x+25=0の解を求めます。 初期値を入力してください。 20 解の値は5.000007 収束するのに21回かかりました。 計算過程を以下に示します。 x[0] 20.000000 x[11] 5.007324 x[1] 12.500000 x[12] 5.003662 x[2] 8.750000 x[13] 5.001831 x[3] 6.875000 x[14] 5.000916 x[4] 5.937500 x[15] 5.000458 x[5] 5.468750 x[16] 5.000229 x[6] 5.234375 x[17] 5.000114 x[7] 5.117188 x[18] 5.000057 x[8] 5.058594 x[19] 5.000029 x[9] 5.029297 x[20] 5.000014 x[10] 5.014648 x[21] 5.000007

プログラム製作<可視部> #include <stdio.h> #include <stdlib.h> #include <math.h> #define max 1000 #define eps 1.0e-5 #define F "x*x-10*x+25" void main() { int count,x,b[max],i,j,k; double newa,a[max],c[max],e[max],f[max],g,l; char v[3]="\n", *data_file; FILE *fpr,*fpw,*gp; count=0; if( (fpr=fopen( "z1.dat","rb"))==NULL) { fprintf(stderr,"ファイルを開けません1。\n"); exit(1)}

プログラム製作<可視部> printf("どちらのファイルを作成しますか?当てはまる数字を入力してください。\n"); printf("txt形式ファイル--->1\n"); printf("csv形式ファイル--->2\n"); while(1){ scanf("%d",&x); if(x==1 || x==2) break; printf("入力し直してください。"); } printf("初期値を入力してください。"); scanf("%lf",&l); printf("何回で収束しましたか?"); scanf("%d",&k); for(i=0;i<l+1;i++) { fread(&a[i],sizeof(double),1,fpr); fread(&b[i],sizeof(int),1,fpr); j=i;} for(i=0;i<2*l+1;i++) {fread( &c[i],sizeof(double),1, fpr); g=c[i];} for(i=0;i<k+1;i++) { fread(&e[i],sizeof(double),1,fpr);}

プログラム製作<可視部> if(x==1) { /*データファイルの作成*/ data_file="z2.txt"; if( (fpw=fopen(data_file,"w"))==NULL) { fprintf(stderr,"ファイルを開けません2。\n"); exit(1);} for(i=0;i<2*a[0]+1;i++) {fprintf(fpw,"%f",i-l); fprintf(fpw," %f\n",c[i]);} fprintf(fpw,"%s",v); for(i=0;i<k;i++) { fprintf(fpw,"%f %d\n",a[i],b[i]); fprintf(fpw,"%f %f\n",a[i],e[i]); fprintf(fpw,"%s",v);} { fprintf(fpw,"%f %f\n",a[i],e[i]); fprintf(fpw,"%f %d\n",a[i+1],b[i]); fprintf(fpw,"%s",v);}}

プログラム製作<可視部> if(x==2) { if( (fpw=fopen( "z2.csv","w"))==NULL) { fprintf(stderr,"ファイルを開けません2。\n"); exit(1);} for(i=0;i<2*a[0]+1;i++) {fprintf(fpw,"%f",i-l); fprintf(fpw," , %f\n",c[i]);} fprintf(fpw,"%s",v); for(i=0;i<k;i++) { fprintf(fpw,"%f , %d\n",a[i],b[i]); fprintf(fpw,"%f , %f\n",a[i],e[i]); fprintf(fpw,"%s",v);}} fclose(fpr); fclose(fpw); if(x==1) {gp = popen("gnuplot -persist","w"); fprintf(gp,"set grid\n"); fprintf(gp, "set xrange [-%f:%f]\n",l,l); fprintf(gp, "set yrange [-%f:%f]\n",g,g); fprintf(gp, "plot \"%s\" with lines linetype 1 title \"x*x-2*x+1\"\n",data_file); fprintf(gp,"replot %s \n",F); pclose(gp);}}

アクティビティ図(データフロー) <<file>> <<executable>> z1.dat z2.csv re2.exe :データファイル  :可視化プログラム :表計算用可視化ファイル サンプル点数 グラフ作成者 <<file>> <<executable>> <<file>> z2.txt re2.exe z1.dat :gnuplot用可視化ファイル :データファイル :可視化プログラム サンプル点数 グラフ作成者

フローチャート(生成部) h[i]=f(i) exit(1) i=0;i<c;i++ fclose(fp) 終了    開始    (main関数) 開始(save関数) ループ =0;i<count;i++ aの入力 (fp=fopen(“z1.dat”,”wb”))=NULL i=1;i<d[0]+1;i++ ループ Save(count,b) h[i]=f(i) exit(1) 終了 i=0;i<c;i++ Count++ fwrite(&h[i],sizeof(double),1,fp) Newa=a-f(a)/de(a) fwrite(&d[i],sizeof(double),1,fp) b[count]=newa fclose(fp) Count==max exit(1) i=0;i<d[0]+1;i++    終了 ループ終了 h[i]=f(-[0]+i) Newa,countの出力 fwrite(&h[i],sizeof(double),1,fp)

フローチャート(可視化部①) i=0;i<k+1;i++ i=0;i<k;i++ exit(1) exit(1); j=i 1 fprintf(fpw,"%f %d\n",a[i],b[i]); fprintf(fpw,"%f %f\n",a[i],e[i]); fprintf(fpw,"%s",v) i=0;i<k+1;i++ if(x==1) 開始(main関数) data_file="z2.txt"; fread(&a[i],sizeof(double),1,fpr) (fpr=fopen(“z1.dat”,”rb”))==NULL i=0;i<k;i++ (fpw=fopen(data_file,"w"))==NULL fread(&b[i],sizeof(int),1,fpr) exit(1) fprintf(fpw,"%f %f\n",a[i],e[i]); fprintf(fpw,"%f %d\n",a[i+1],b[i]); fprintf(fpw,"%s",v) exit(1); j=i 1 i=0;i<2*a[0]+1;i++ x==2   Xの入力 fprintf(fpw,"%f",i-l); fprintf(fpw," %f\n",c[i]); i=0;i<2*l+1;i++ (fpw=fopen( "z2.csv","w"))==NULL X==1||x==2 Fread(&c[i],sizeof(double),1,fp) exit(1) i=0;i<2*a[0]+1;i++ break g=c[i] i=0;i<2*a[0]+1;i++) fprintf(fpw,"%f",i-l); fprintf(fpw," %f\n",c[i]) fprintf(fpw,"%f",i-l); fprintf(fpw," , %f\n",c[i])  lの入力 i=0;i<k+1;i++ kの入力 Fread(&e[i],sizeof(double),1,fpr) i=0;i<k;i++

フローチャート(可視化部②) i=0;i<k;i++ fclose(fpr); fclose(fpw); 終了 fprintf(fpw,"%f , %d\n",a[i],b[i]); fprintf(fpw,"%f , %f\n",a[i],e[i]); fprintf(fpw,"%s",v) fclose(fpr); fclose(fpw); 終了

グラフへの可視化 図 1 図 2 図 1;gnuplotによるグラフ可視化 図 2; excel によるグラフ可視化

課題に対する考察 生成部でforを駆使していくことにより、出力結果では2 0回の計算結果を算出しているが、今回製作したプログ ラムでは、どんな回数でも表示できるようになっているの ではないかと考えている。 グラフへの可視化において、図 2のexcelを用いて表 示したグラフでは、x>0の部分で途切れているが、ここ では今回自ら設定した方程式f(x)=x^2-10*x+25=0の 初期値が20に設定されているためであると考えられる。