×

[PR]この広告は3ヶ月以上更新がないため表示されています。
ホームページを更新後24時間以内に表示されなくなります。


C言語

プロフィール

プロフィール画像
■ 某国立大学に通う大学生です。
■ サッカー大好き
■ プログラミングを始めてまだ一年です。
>>プロフィールの詳細


C言語


RC直列回路のキャパシタの電圧の時間変化を求め
gnuplotを使ってグラフ化



必要な文法[gnuplotの呼び出し]
考え方
ソースプログラム

必要な文法[gnuplotの呼び出し]


#include <stdio.h>
									
int main(void){
									  
	FILE *fp;
	char a[20];
	strcpy(a, "グラフ化したいファイル名");
	.
	.
	.
	fp=popen("gnuplot -persist","w");
	fprintf(fp, "plot \"%s\" u 1:2 w l \n",グラフ化したいファイル名);
	.
	.
	fclose(fp);
}

上記のように記述する事で、自動的にgnuplotを呼び出し、グラフ化する事が出来ます。
上の場合ではグラフ化したいファイルの一列目にx軸, 二列目にy軸という形で記述されています。
gnuplotの軸の設定やreplotをしたい場合はその都度fprintf...のように記述します。
gnuplotのコマンドはこちらを参照ください。
またこのようにプログラム内でgnuplotを呼び出すにはgnuplotのパスを通す必要があります。
パスの通し方についてはこちらを参照ください。

考え方

RC直列回路図を以下に示します。
rc直列回路
本来、Cの電圧を求めるのには微分方程式を解く必要があります。
なぜならCに置ける式は以下のようになるからです。
式1
ですが、プログラムで求める場合は、その必要はありません!
このような微分方程式のdtを微小時間として具体的な値を入れてやり、
それをある時刻までループさせるという考え方で出来ます。
RC直列回路の場合、Cに蓄積される電荷Qをベースに考えます。
t=0ではQ=0です。
そしてCの電圧VcはVc=Q/Cなので当然0となります。
次に刻み時間dtを非常に小さい時間(例えばdt=0.001)に設定します。
そしてループ文を用いて、刻み時間分、時間を進めていき、
各時間ごとに電荷Qに増えた電荷dQを足し
電圧Vcを計算していく事になります。
ループ分の中の式は具体的には以下のようになります。
式1

ソースプログラム

for文によるプログラム

#include <stdio.h>
#include <string.h>
			
#define R 1000
#define C 0.1
#define Vin 5.0
#define dt 0.001
			
			
int main(void){
			
	double t=0;
	double Q=0;
	double dQ=0;
	double Vc=0;
	FILE *fp;
	FILE *gp;
	char graph[10];
			
	strcpy(graph,"rc.dat");
	fp=fopen(graph,"w");
	
	while(t<1000){
		dQ=(Vin-Vc)*dt/R;
		Q+=dQ;
		Vc=Q/C;
		fprintf(fp,"%f %f\n",t,Vc);
		t+=dt;
	}
				
	gp=popen("gnuplot -persist","w");
	fprintf(gp, "plot \"%s\" u 1:2 w st lw 3\n",graph);
	fclose(fp);
	fclose(gp);
	printf("%sを作成しました。\n"graph);
	return 0;
}


実行結果は以下のようになります。
実行結果

rc.datを作成しました。 rc結果
時間tが1000秒まで、そして電圧が5Vで飽和している事が確認できました。
このようにコンピュータを使えば、微分方程式を解かずに力技でグラフを出せます。
理解できましたか。

C言語〜rc直列回路のキャパシタの電圧の時間変化を求めgnuplotを使ってグラフ化〜
C言語〜サンプルプログラム〜トップへ▲

ホームページ テンプレート フリー">

Design by