以下のプログラムを実行しました。
補間点のファイルは以下のとおりです。
0
0.1963495408
0.3926990817
0.5890486225
0.7853981634
0.9817477042
1.1780972451
1.3744467859
1.5707963268
プログラム=========================================
/***
simpson公式の検証プログラム
教科書 : p46
***/
#include<stdio.h>
#include<math.h>
#define DIVISION 100
#define INPUT 100
#define FILE_NAME 1024
/***値の交換を行うプログラム***/
void swap(double *a, double *b)
{
double temp = *a;
*a = *b;
*b = temp;
}
/***バブルソートを行う関数***/
void bsort(double a[], int n)
{
int i, j;
for(i=0; i<n-1; i++) {
for(j=n-1; j>i; j--) {
if(a[j-1]>a[j]) {
swap(&a[j-1], &a[j]);
}
}
}
}
/***多項式の値を返す関数 ***/
double fi_x(double x, double xi[], int i)
{
double f = (x - xi[i+1])*(x - xi[i+2])/(xi[i] - xi[i+1])/(xi[i] - xi[i+2])*sin(xi[i])
+ (x - xi[i]) *(x - xi[i+2])/(xi[i+1] - xi[i]) /(xi[i+1] - xi[i+2])*sin(xi[i+1])
+ (x - xi[i]) *(x - xi[i+1])/(xi[i+2] - xi[i]) /(xi[i+2] - xi[i+1])*sin(xi[i+2]);
return f;
}
/***積分の値を返す関数 :積分区間[x[i], x[i+2]]***/
double sekibun(int i, double xi[])
{
double temp;
temp = 1.0/6*(
(xi[i+2] - xi[i])*(2*xi[i] + xi[i+2] - 3*xi[i+1])*sin(xi[i])
+ pow((xi[i] - xi[i+2]),3)*sin(xi[i+1])/(xi[i+1] - xi[i])/(xi[i+1] - xi[i+2])
+ (xi[i+2] - xi[i])*(2*xi[i+2] + xi[i] - 3*xi[i+1])*sin(xi[i+2])/(xi[i+2] - xi[i+1])
);
return temp;
}
/***メインプログラム***/
int main(void)
{
/*変数とファイル名の定義*/
FILE *fp, *gp;
double xi[INPUT+1]; //補間点の座標
double X[DIVISION+1], Y[DIVISION+1]; //近似関数の座標
double I = 0.; //積分結果を格納する変数
int N = 0, cnt = 0, i, j;
char frame[FILE_NAME];
/*補間点の読み取り*/
printf("ファイル名:");
scanf("%s", frame);
if( (fp = fopen(frame, "r")) == NULL )
printf("ファイルをオープンできません\n");
else {
while (fscanf(fp, "%lf", &xi[cnt++]) == 1) {
}
fclose(fp);
}
N = cnt - 2;
/*補間点は偶数であるという条件*/
if(!N%2)
N -= 1;
/*読み取った値をバブルソート*/
bsort(xi, N);
/*補間関数のx座標*/
X[0] = xi[0];
for(i=1; i<=DIVISION; i++)
X[i] = X[i-1] + (xi[N] - xi[0]) / DIVISION;
/*補間関数のy座標*/
for(i=0; i<=N-2; i+2) {
for(j=0; j<=DIVISION; j++) {
if(xi[i] <= X[j] && X[j] <= xi[i+2])
Y[j] = fi_x(X[j], xi, i);
}
}
/*積分の実行*/
for(i=0; i<=N-2; i+2)
I += sekibun(i,xi);
printf("[%lf,%lf]での積分の結果は%lfです。\n", X[0], X[DIVISION], I);
/*グラフの作成*/
gp = popen("gnuplot4 -persist", "w");
fprintf(gp, "set multiplot\n");
fprintf(gp, "set xrange[%lf : %lf]\n", X[0], X[DIVISION]);
fprintf(gp, "set yrange[%lf : %lf]\n", -1.5, 1.5);
fprintf(gp, "plot sin(x) with points\n");
fprintf(gp, "plot '-' with lines linetype 1 title \"sin\" \n"); //データの送信
for(i=0; i<DIVISION; i++)
{
fprintf(gp, "%lf\t%lf\n", X[i], Y[i]);
}
fprintf(gp, "e\n");
pclose(gp);
return 0;
}
==============================================
実行結果
[]$gcc simpson_rule-t1.c -lm
[]$./a.out
ファイル名:d1.dat
^Z
[6]+ 停止 ./a.out
プログラムが終了しません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript 最小二乗法 2 2023/01/01 20:57
- 統計学 1次式の線形回帰 1 2023/05/10 14:49
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- 統計学 1/n^2Σ【i=1→n】V[Xi]=1/n V[X1]となるのはなぜですか? Xは確率関数です。 2 2023/08/19 13:28
- 統計学 統計学の問題です。どうか教えてください。 線形回帰モデルYi=β0+β1xi+ui(i=1,2,.. 5 2023/06/16 00:51
- 数学 特定の座標点を通る回帰を行う方法について。 2 2022/10/10 10:27
- 携帯型ゲーム機 ドラクエの ドラゴンクエストXI 過ぎ去りし時を求めて ドラクエクレジャーズ どちらが面白いですか? 1 2023/01/14 03:57
- 統計学 標準誤差の求め方 2 2022/07/04 19:59
- 数学 N を2以上の自然数として,N 個のデータ{xn}を考える。以下の3条件が互いに同値であることを示し 1 2023/04/17 18:41
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
float型とdouble型の変数の違い...
-
プログラムでの数字につく”f”の...
-
C 開放してるのにエラー(doubl...
-
C言語を実行すると-infが出てき...
-
たくさんの数の平均を求める方...
-
doubleの変数にintとintの割り...
-
2次方程式の解を求めるプログ...
-
C言語
-
三角形OABの面積を求めるプ...
-
C言語 関数プロトタイプ宣言の...
-
c言語のプログラミングについて...
-
c言語で、繰り返し文の中で、0....
-
関数におけるif文とreturn文に...
-
C言語の型による処理速度の違い
-
c言語のコンパイルエラー canno...
-
C言語で直角三角形の斜辺を求め...
-
C++で外積
-
double型とint型で三分の一乗の...
-
EXE1→DLL→EXE2数値を受け渡す方法
-
C言語初心者 構造体 課題について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムでの数字につく”f”の...
-
float型とdouble型の変数の違い...
-
doubleの変数にintとintの割り...
-
C言語を実行すると-infが出てき...
-
C 開放してるのにエラー(doubl...
-
至急です! マクロ定義で #defi...
-
c言語で、繰り返し文の中で、0....
-
関数におけるif文とreturn文に...
-
C言語 関数プロトタイプ宣言の...
-
C言語初心者 構造体 課題について
-
C言語の型による処理速度の違い
-
Cで3乗根を求める方法
-
C言語で-23乗を取り扱うには
-
2分法で方程式の複数の解を自...
-
doubleは常に%lfとするべきなのか
-
c言語のコンパイルエラー canno...
-
C言語で直角三角形の斜辺を求め...
-
C言語のプログラムで#include<m...
-
int とdoubleの比較
-
C++で外積
おすすめ情報