#include <stdio.h>
#include <math.h>
#define EPSILON 1e-5
#define MAX_ITER 100
double f1(double x, double y) { return x * x + y * y - 4; }
double f2
(double x
, double y
) { return pow(x
, 4) + x
- y
* y
+ 1; }
double df1_dx(double x, double y) { return 2 * x; }
double df1_dy(double x, double y) { return 2 * y; }
double df2_dx(double x, double y) { return 4 * x * x * x + 1; }
double df2_dy(double x, double y) { return -2 * y; }
void solve(int attempt, double x0, double y0) {
double x = x0, y = y0;
int iter = 0;
printf("\n--- 試行 #%d: (初期値 x0=%.2f, y0=%.2f) ---\n", attempt
, x0
, y0
); printf("%-5s %-15s %-15s\n", "反復", "x", "y");
while (iter <= MAX_ITER) {
double F1 = f1(x, y);
double F2 = f2(x, y);
// 各反復のx, yを表示
printf("%-5d %-15.10f %-15.10f\n", iter
, x
, y
);
// 収束判定: |f1| < 10^-5 かつ |f2| < 10^-5
if (fabs(F1
) < EPSILON
&& fabs(F2
) < EPSILON
) { printf(">> 結果: 反復回数 %d 回で収束しました。\n", iter
); printf(">> 解: (x = %.5f, y = %.5f)\n", x
, y
); return;
}
double J11 = df1_dx(x, y);
double J12 = df1_dy(x, y);
double J21 = df2_dx(x, y);
double J22 = df2_dy(x, y);
double det = J11 * J22 - J12 * J21;
printf(">> 結果: 失敗 (ヤコビ行列の行列式が小さすぎます)。\n"); return;
}
x += (-F1 * J22 + F2 * J12) / det;
y += (-J11 * F2 + J21 * F1) / det;
iter++;
}
printf(">> 結果: 失敗 (%d 回の反復内に収束しませんでした)。\n", MAX_ITER
); }
int main() {
// 異なる3組の初期値(x0, y0)で計算すること
double initial_x[] = {1.2, -1.0, 0.5};
double initial_y[] = {1.5, 1.0, -1.8};
for (int i = 0; i < 3; i++) {
solve(i + 1, initial_x[i], initial_y[i]);
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+CgojZGVmaW5lIEVQU0lMT04gMWUtNSAKI2RlZmluZSBNQVhfSVRFUiAxMDAKCmRvdWJsZSBmMShkb3VibGUgeCwgZG91YmxlIHkpIHsgcmV0dXJuIHggKiB4ICsgeSAqIHkgLSA0OyB9CmRvdWJsZSBmMihkb3VibGUgeCwgZG91YmxlIHkpIHsgcmV0dXJuIHBvdyh4LCA0KSArIHggLSB5ICogeSArIDE7IH0KCmRvdWJsZSBkZjFfZHgoZG91YmxlIHgsIGRvdWJsZSB5KSB7IHJldHVybiAyICogeDsgfQpkb3VibGUgZGYxX2R5KGRvdWJsZSB4LCBkb3VibGUgeSkgeyByZXR1cm4gMiAqIHk7IH0KZG91YmxlIGRmMl9keChkb3VibGUgeCwgZG91YmxlIHkpIHsgcmV0dXJuIDQgKiB4ICogeCAqIHggKyAxOyB9CmRvdWJsZSBkZjJfZHkoZG91YmxlIHgsIGRvdWJsZSB5KSB7IHJldHVybiAtMiAqIHk7IH0KCnZvaWQgc29sdmUoaW50IGF0dGVtcHQsIGRvdWJsZSB4MCwgZG91YmxlIHkwKSB7CiAgICBkb3VibGUgeCA9IHgwLCB5ID0geTA7CiAgICBpbnQgaXRlciA9IDA7CgogICAgcHJpbnRmKCJcbi0tLSDoqabooYwgIyVkOiAo5Yid5pyf5YCkIHgwPSUuMmYsIHkwPSUuMmYpIC0tLVxuIiwgYXR0ZW1wdCwgeDAsIHkwKTsKICAgIHByaW50ZigiJS01cyAlLTE1cyAlLTE1c1xuIiwgIuWPjeW+qSIsICJ4IiwgInkiKTsKCiAgICB3aGlsZSAoaXRlciA8PSBNQVhfSVRFUikgewogICAgICAgIGRvdWJsZSBGMSA9IGYxKHgsIHkpOwogICAgICAgIGRvdWJsZSBGMiA9IGYyKHgsIHkpOwoKICAgICAgICAvLyDlkITlj43lvqnjga54LCB544KS6KGo56S6CiAgICAgICAgcHJpbnRmKCIlLTVkICUtMTUuMTBmICUtMTUuMTBmXG4iLCBpdGVyLCB4LCB5KTsKCiAgICAgICAgLy8g5Y+O5p2f5Yik5a6aOiB8ZjF8IDwgMTBeLTUg44GL44GkIHxmMnwgPCAxMF4tNQogICAgICAgIGlmIChmYWJzKEYxKSA8IEVQU0lMT04gJiYgZmFicyhGMikgPCBFUFNJTE9OKSB7CiAgICAgICAgICAgIHByaW50ZigiPj4g57WQ5p6cOiDlj43lvqnlm57mlbAgJWQg5Zue44Gn5Y+O5p2f44GX44G+44GX44Gf44CCXG4iLCBpdGVyKTsKICAgICAgICAgICAgcHJpbnRmKCI+PiDop6M6ICh4ID0gJS41ZiwgeSA9ICUuNWYpXG4iLCB4LCB5KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgZG91YmxlIEoxMSA9IGRmMV9keCh4LCB5KTsKICAgICAgICBkb3VibGUgSjEyID0gZGYxX2R5KHgsIHkpOwogICAgICAgIGRvdWJsZSBKMjEgPSBkZjJfZHgoeCwgeSk7CiAgICAgICAgZG91YmxlIEoyMiA9IGRmMl9keSh4LCB5KTsKCiAgICAgICAgZG91YmxlIGRldCA9IEoxMSAqIEoyMiAtIEoxMiAqIEoyMTsKICAgICAgICBpZiAoZmFicyhkZXQpIDwgMWUtMTIpIHsKICAgICAgICAgICAgcHJpbnRmKCI+PiDntZDmnpw6IOWkseaVlyAo44Ok44Kz44OT6KGM5YiX44Gu6KGM5YiX5byP44GM5bCP44GV44GZ44GO44G+44GZKeOAglxuIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHggKz0gKC1GMSAqIEoyMiArIEYyICogSjEyKSAvIGRldDsKICAgICAgICB5ICs9ICgtSjExICogRjIgKyBKMjEgKiBGMSkgLyBkZXQ7CiAgICAgICAgaXRlcisrOwogICAgfQogICAgcHJpbnRmKCI+PiDntZDmnpw6IOWkseaVlyAoJWQg5Zue44Gu5Y+N5b6p5YaF44Gr5Y+O5p2f44GX44G+44Gb44KT44Gn44GX44GfKeOAglxuIiwgTUFYX0lURVIpOwp9CgppbnQgbWFpbigpIHsKICAgIC8vIOeVsOOBquOCizPntYTjga7liJ3mnJ/lgKQoeDAsIHkwKeOBp+ioiOeul+OBmeOCi+OBk+OBqAogICAgZG91YmxlIGluaXRpYWxfeFtdID0gezEuMiwgLTEuMCwgMC41fTsKICAgIGRvdWJsZSBpbml0aWFsX3lbXSA9IHsxLjUsIDEuMCwgLTEuOH07CgogICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKICAgICAgICBzb2x2ZShpICsgMSwgaW5pdGlhbF94W2ldLCBpbml0aWFsX3lbaV0pOwogICAgfQoKICAgIHJldHVybiAwOwp9