ID非公開
ID非公開さん
2021/1/17 2:34
1回答
f(x)=e^(x^2/(-2))/sqrt(2pi)について、定積分を求めるソースを書いてみました。Xmaxはインテグラルの上の部分の数字のことで、Nは面積を何個に分割して求めるかです。それぞれ適当な数をはめた後、Xmaxに無限大を入
f(x)=e^(x^2/(-2))/sqrt(2pi)について、定積分を求めるソースを書いてみました。Xmaxはインテグラルの上の部分の数字のことで、Nは面積を何個に分割して求めるかです。それぞれ適当な数をはめた後、Xmaxに無限大を入 れたいです。 ソースを考えるうえで、写真の式を考えました。 ただ、実行するとprintfによって表示されるものがありませんでした。なにがまずいのでしょうか? c言語です。 #include <stdio.h> #include <math.h> int main(void) { double A, ans1, ans2, N1, N2, X, Y, sigma1, sigma2, pi; double I = 1 / 0.0; int i; pi = 3.14159; X = 100.0; N1 = 10.0 * X; A = pow(X, 2.0); for(i = 0; i < N1-1; i++) { sigma1 += pow(X * i / N1, 2.0) / (-2.0); } ans1 = (1 / 2 + sigma1 + exp(A / (-2)) * X / (sqrt(2 * pi) * N1)); Y = I; N2 = 10.0 * Y; A = pow(X, 2.0); for(i = 0; i < N2-1; i++) { sigma2 += pow(X * i / N2, 2.0) / (-2.0); } ans2 = (1 / 2 + sigma2 + exp(A / (-2)) * Y / (sqrt(2 * pi) * N2)); printf("ans1=%lf ans2=%lf X=%lf Y=%lf N1=%lf N2=%lf\n", ans1, ans2, X, Y, N1, N2); return 0; }
C言語関連・10閲覧
ベストアンサー
プログラムを見るに、Nの値はX_maxの10倍の値を設定されているようですが、X_maxを無限大にした場合、当然ながらNの値も無限大になります。つまり、kをどれだけ増やしていってもNの値を超えないため、項の数が無限大となり、プログラムはΣの計算部分で永久にループし続けます。 これを避けるためには、適切な変数変換を行って必ず有限の長さの区間にしなければなりません。一般に、開区間[a, +∞)での広義積分に対しては、以下のような変数変換が用いられます。 説明変数: x = a + (1 - t) / t 積分区間: [a, +∞) → [0, 1] https://www.gnu.org/software/gsl/doc/html/integration.html#c.gsl_integration_qagiu 区分求積の導出などは数式が多く複雑なのでこちらにまとめました。 https://gist.github.com/Kogia-sima/02c265e6681a89e8d7ccff364327fd04 お役に立てれば幸いです。
ID非公開
ID非公開さん
質問者
2021/1/18 13:42