#include <stdio.h>
#include <math.h>
#define EPSILON 1e-7 // 変化量の判定基準
#define MAX_ITER 100
// 確定した特性方程式 f(λ)
double f(double lambda) {
return pow(lambda
, 4) + pow(lambda
, 3) - 54.0 * pow(lambda
, 2) - 224.0 * lambda
- 345.0; }
// 導関数 f'(λ)
double df(double lambda) {
return 4.0 * pow(lambda
, 3) + 3.0 * pow(lambda
, 2) - 108.0 * lambda
- 224.0; }
void solve_newton(int attempt, double lambda0) {
double lambda = lambda0;
int iter = 0;
while (iter <= MAX_ITER) {
double f_val = f(lambda);
double df_val = df(lambda);
if (fabs(df_val
) < 1e-12) { printf("試行 #%d (初期値 %5.1f) -> 傾きが平らなため失敗\n", attempt
, lambda0
); return;
}
// 次の修正値を計算
double delta = f_val / df_val;
lambda -= delta;
iter++;
// 【修正】yの値ではなく、「x(lambda)の移動距離」が基準値以下になったら収束とみなす
if (fabs(delta
) < EPSILON
) { printf("試行 #%d (初期値 %5.1f) -> 収束成功 (%2d回) | 固有値解 λ = %.10f\n", attempt, lambda0, iter, lambda);
return;
}
}
printf("試行 #%d (初期値 %5.1f) -> 未収束\n", attempt
, lambda0
); }
int main() {
// 判定条件を移動距離に変えたため、この素直な初期値で4つの解が綺麗に分かれます
double initial_lambda[] = {10.0, -1.0, -3.2, -5.0};
printf("=== ニュートン・ラフソン法による実数解(固有値)の探索結果 ===\n"); for (int i = 0; i < 4; i++) {
solve_newton(i + 1, initial_lambda[i]);
}
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+CgojZGVmaW5lIEVQU0lMT04gMWUtNyAgIC8vIOWkieWMlumHj+OBruWIpOWumuWfuua6lgojZGVmaW5lIE1BWF9JVEVSIDEwMAoKLy8g56K65a6a44GX44Gf54m55oCn5pa556iL5byPIGYozrspCmRvdWJsZSBmKGRvdWJsZSBsYW1iZGEpIHsKICAgIHJldHVybiBwb3cobGFtYmRhLCA0KSArIHBvdyhsYW1iZGEsIDMpIC0gNTQuMCAqIHBvdyhsYW1iZGEsIDIpIC0gMjI0LjAgKiBsYW1iZGEgLSAzNDUuMDsKfQoKLy8g5bCO6Zai5pWwIGYnKM67KQpkb3VibGUgZGYoZG91YmxlIGxhbWJkYSkgewogICAgcmV0dXJuIDQuMCAqIHBvdyhsYW1iZGEsIDMpICsgMy4wICogcG93KGxhbWJkYSwgMikgLSAxMDguMCAqIGxhbWJkYSAtIDIyNC4wOwp9Cgp2b2lkIHNvbHZlX25ld3RvbihpbnQgYXR0ZW1wdCwgZG91YmxlIGxhbWJkYTApIHsKICAgIGRvdWJsZSBsYW1iZGEgPSBsYW1iZGEwOwogICAgaW50IGl0ZXIgPSAwOwoKICAgIHdoaWxlIChpdGVyIDw9IE1BWF9JVEVSKSB7CiAgICAgICAgZG91YmxlIGZfdmFsID0gZihsYW1iZGEpOwogICAgICAgIGRvdWJsZSBkZl92YWwgPSBkZihsYW1iZGEpOwoKICAgICAgICBpZiAoZmFicyhkZl92YWwpIDwgMWUtMTIpIHsKICAgICAgICAgICAgcHJpbnRmKCLoqabooYwgIyVkICjliJ3mnJ/lgKQgJTUuMWYpIC0+IOWCvuOBjeOBjOW5s+OCieOBquOBn+OCgeWkseaVl1xuIiwgYXR0ZW1wdCwgbGFtYmRhMCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIOasoeOBruS/ruato+WApOOCkuioiOeulwogICAgICAgIGRvdWJsZSBkZWx0YSA9IGZfdmFsIC8gZGZfdmFsOwogICAgICAgIGxhbWJkYSAtPSBkZWx0YTsKICAgICAgICBpdGVyKys7CgogICAgICAgIC8vIOOAkOS/ruato+OAkXnjga7lgKTjgafjga/jgarjgY/jgIHjgIx477yIbGFtYmRh77yJ44Gu56e75YuV6Led6Zui44CN44GM5Z+65rqW5YCk5Lul5LiL44Gr44Gq44Gj44Gf44KJ5Y+O5p2f44Go44G/44Gq44GZCiAgICAgICAgaWYgKGZhYnMoZGVsdGEpIDwgRVBTSUxPTikgewogICAgICAgICAgICBwcmludGYoIuippuihjCAjJWQgKOWIneacn+WApCAlNS4xZikgLT4g5Y+O5p2f5oiQ5YqfICglMmTlm54pIHwg5Zu65pyJ5YCk6KejIM67ID0gJS4xMGZcbiIsIAogICAgICAgICAgICAgICAgICAgYXR0ZW1wdCwgbGFtYmRhMCwgaXRlciwgbGFtYmRhKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIHByaW50Zigi6Kmm6KGMICMlZCAo5Yid5pyf5YCkICU1LjFmKSAtPiDmnKrlj47mnZ9cbiIsIGF0dGVtcHQsIGxhbWJkYTApOwp9CgppbnQgbWFpbigpIHsKICAgIC8vIOWIpOWumuadoeS7tuOCkuenu+WLlei3nembouOBq+WkieOBiOOBn+OBn+OCgeOAgeOBk+OBrue0oOebtOOBquWIneacn+WApOOBpzTjgaTjga7op6PjgYzntrrpupfjgavliIbjgYvjgozjgb7jgZkKICAgIGRvdWJsZSBpbml0aWFsX2xhbWJkYVtdID0gezEwLjAsIC0xLjAsIC0zLjIsIC01LjB9OwoKICAgIHByaW50ZigiPT09IOODi+ODpeODvOODiOODs+ODu+ODqeODleOCveODs+azleOBq+OCiOOCi+Wun+aVsOino++8iOWbuuacieWApO+8ieOBruaOoue0oue1kOaenCA9PT1cbiIpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKICAgICAgICBzb2x2ZV9uZXd0b24oaSArIDEsIGluaXRpYWxfbGFtYmRhW2ldKTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQ==