| toi3.c |
/*
* toi3.c --- euler1ex1.c (Euler method for Malthusian model)
*/
#include <stdio.h>
#include <stdlib.h>
double k = 1.0;
int main(void)
{
int i, N;
double t, x, dt;
double f(double, double), x0;
double Tmax;
FILE *of;
if ((of = fopen("euler1ex1.data", "w")) == NULL) {
fprintf(stderr, "cannot open euler1ex1.data");
exit(1);
}
// 初期値
x0 = 1.0;
// 最終時刻
Tmax = 1.0;
// 時間刻み
printf("# N: "); scanf("%d", &N);
fprintf(of, "# N = %d\n", N);
dt = Tmax / N;
// 初期値
t = 0.0;
x = x0;
printf("# t x\n");
fprintf(of, "# t x\n");
printf("%f %f\n", t, x);
fprintf(of, "%f %f\n", t, x);
// Euler 法
for (i = 0; i < N; i++) {
x += dt * f(x, t);
t = (i + 1) * dt;
printf("%f %f\n", t, x);
fprintf(of, "%f %f\n", t, x);
}
fclose(of);
if ((of = popen("gnuplot", "w")) == NULL) {
fprintf(stderr, "cannot open pipe.\n");
exit(1);
}
fprintf(of, "plot \"euler1ex1.data\" with l\n");
fflush(of);
pclose(of);
return 0;
}
double f(double x, double t)
{
return k * x;
}
|
もちろん gnuplot は事前にインストールしておく必要がある。 コンパイル&実行すると、N の値を尋ねてくるので、 例えば 100 と入力すると、 gnuplot が起動されてグラフが描かれるはず。
popen(), pclose() は、C++ でも使えるので (別の関数を使うべきか?)、 次でとりあえず動く。
| toi3.cpp |
/*
* toi3.cpp --- euler1ex1.c (Euler method for Malthusian model)
*/
#include <iostream>
#include <fstream>
using namespace std;
double k = 1.0;
int main(void)
{
int i, N;
double t, x, dt;
double f(double, double), x0;
double Tmax;
ofstream ofs("euler1ex1.data");
FILE *of;
if (!ofs) {
cerr << "cannot open euler1ex1.data" << endl;
exit(1);
}
// 初期値
x0 = 1.0;
// 最終時刻
Tmax = 1.0;
// 時間刻み
cout << "# N: "; cin >> N;
ofs << "# N = " << N << endl;
dt = Tmax / N;
// 初期値
t = 0.0;
x = x0;
cout << "# t x" << endl;
ofs << "# t x" << endl;
cout << fixed;
cout << t << " " << x << endl;
ofs << fixed;
ofs << t << " " << x << endl;
// Euler 法
for (i = 0; i < N; i++) {
x += dt * f(x, t);
t = (i + 1) * dt;
cout << t << " " << x << endl;
ofs << t << " " << x << endl;
}
ofs.close();
if ((of = popen("gnuplot", "w")) == NULL) {
fprintf(stderr, "cannot open pipe.\n");
exit(1);
}
fprintf(of, "plot \"euler1ex1.data\" with l\n");
fflush(of);
pclose(of);
return 0;
}
double f(double x, double t)
{
return k * x;
}
|