前提・実現したいこと
ニュートン法の問題を解くプログラムをC++で作成しています。
z^3-1 = 0となるz= 1となるように解くことのできる初期値を求めるプログラムです。
初期値は-2 =< x <= 2 -2 <= y <= 2の間を500等分した点を予め求めておいて(0、0)となる原点のみ省いたもの配列に保存して、その後予め求めたx yそれぞれについての漸化式を用いて、収束するかどうかを判定し、z=1に収束する組のみを保存するつもりで書きました。
発生している問題・エラーメッセージ
実行すると計算そのものは表示され実行されているのですが、(条件分岐も通っています)
ある程度まで実行すると下記のエラーが発生し止まってしまいます。
Segmentation fault: 11
どこの部分で起こっているのか教えていただきたいです。
該当のソースコード
#include <iostream> #include <math.h> using namespace std; double f(int x) { double num = exp(-(x * x)) - sin(x); return num; } double dff(int x) { double num = -2 * exp(-(x * x)) - cos(x); return num; } int main(void) { long int counter = 0; double x = 0; double y = 0; double x1 = 0; double y1 = 0; double x_init = 0; double y_init = 0; double xh[500]; double yh[500]; double app = 4.0 / 500.0; double num = -2; double ans_x[25000]; //収束する初期値の保存する配列、余剰のために25000取ってあります double ans_y[25000]; for (int i = 0; i < 500; i++) {//ここで初期値を生成しています(ここだけだとエラーは出ていません) if (i == 250) { num += app; xh[i] = num; yh[i] = num; } else { xh[i] = num; yh[i] = num; } num += app; } for (int i = 0; i < 500; i++) { x = xh[i]; x_init = x; for (int t = 0; t < 500; t++) { y = yh[t]; y_init = y; while (1) { cout << "x1:" << x1 << " " << "y1:" << y1 << endl; x1 = (2.0 * x) / 3.0 + ((x * x) - (y * y)) / (3 * (x * x + y * y) * (x * x + y * y)); y1 = (2 * y) / 3 - (2 * x * y) / (3 * ((x * x + y * y) * (x * x + y * y))); if ((abs(x1 - x) < 1.0e-6) && (abs(y1 - y) < 1.0e-6)) {//収束判定です。この時点ではz = 1に収束するかわからないので次で判定します。 if (abs(sqrt(pow(1 - x1, 2) + pow(y1, 2))) < 1.0e-6) {//ここで完全に判定します。 ans_x[counter] = x_init; ans_y[counter] = y_init; counter += 1; break; } break; } x = x1; y = y1; } } } cout << "finish" << endl; }
試したこと
デバッガに慣れておらずあまりに回数の多い処理のデバッグができず、非常に苦慮しています。どこの部分を改善すべきかご教示いただけると幸いです。
回答4件
あなたの回答
tips
プレビュー