#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define SIZE 4
#define EPSILON_POWER 1e-9
#define EPSILON_NEWTON 1e-7
#define MAX_ITER 1000
double vector_norm(double *v, int n) {
double sum = 0.0;
for (int i = 0; i < n; i++) {
sum += v[i] * v[i];
}
}
void mat_vec_mul(double A[SIZE][SIZE], double *x, double *y, int n) {
for (int i = 0; i < n; i++) {
y[i] = 0.0;
for (int j = 0; j < n; j++) {
y[i] += A[i][j] * x[j];
}
}
}
double f(double lambda) {
return pow(lambda
, 4) - 2.0 * pow(lambda
, 3) - 43.0 * pow(lambda
, 2) - 36.0 * lambda
+ 130.0; }
double df(double lambda) {
return 4.0 * pow(lambda
, 3) - 6.0 * pow(lambda
, 2) - 86.0 * lambda
- 36.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) return;
double delta = f_val / df_val;
lambda -= delta;
iter++;
if (fabs(delta
) < EPSILON_NEWTON
) { printf("試行 #%d (初期値 %5.1f) -> 収束成功 (%2d回) | 固有値解 λ = %.10f\n", attempt, lambda0, iter, lambda);
return;
}
}
}
// --- メイン関数 ---
int main() {
// 2つ目の行列 A
double A[SIZE][SIZE] = {
{2.0, 1.0, 2.0, 5.0},
{3.0, -3.0, 1.0, 6.0},
{0.0, 1.0, 2.0, 7.0},
{1.0, 1.0, 3.0, 1.0}
};
double x[SIZE], y[SIZE], Ax[SIZE];
double lambda_old = 0.0, lambda_new = 0.0;
// 1. べき乗法を最初に実行
printf("==================================================\n"); printf(" 【 手法 1 : べき乗法 】 \n"); printf("==================================================\n");
for (int i = 0; i < SIZE; i++) {
x[i] = 1.0;
}
printf("初期ベクトル x(0): [%.1f, %.1f, %.1f, %.1f]\n\n", x
[0], x
[1], x
[2], x
[3]); printf("%-5s | %-12s | %-12s | %-30s\n", "Iter", "固有値(新)", "差分値", "固有ベクトルx(k)");
int actual_iters = 0;
for (int iter = 1; iter <= MAX_ITER; iter++) {
actual_iters = iter;
mat_vec_mul(A, x, y, SIZE);
double norm_y = vector_norm(y, SIZE);
if (norm_y < 1e-12) break;
for (int i = 0; i < SIZE; i++) {
y[i] /= norm_y;
}
mat_vec_mul(A, y, Ax, SIZE);
double num = 0.0, den = 0.0;
for (int i = 0; i < SIZE; i++) {
num += y[i] * Ax[i];
den += y[i] * y[i];
}
lambda_new = num / den;
double diff
= fabs(lambda_new
- lambda_old
);
if (iter <= 5 || iter % 5 == 0) {
printf("%-5d | %-12.8f | %-12.4e | [%.5f, %.5f, %.5f, %.5f]\n", iter, lambda_new, diff, y[0], y[1], y[2], y[3]);
}
if (diff < EPSILON_POWER) {
if (iter % 5 != 0 && iter > 5) {
printf("%-5d | %-12.8f | %-12.4e | [%.5f, %.5f, %.5f, %.5f]\n", iter, lambda_new, diff, y[0], y[1], y[2], y[3]);
}
break;
}
for (int i = 0; i < SIZE; i++) {
x[i] = y[i];
}
lambda_old = lambda_new;
}
printf("反復回数 %d 回で収束しました。\n", actual_iters
); printf("\n最大固有値 (λ1) : %.10f\n", lambda_new
); printf("対応する固有ベクトル (x1) : ["); for (int i = 0; i < SIZE; i++) {
printf("%.10f%s", y
[i
], (i
== SIZE
- 1) ? "]\n" : ", "); }
printf("\n 検証: Ax と λx の比較 \n"); mat_vec_mul(A, y, Ax, SIZE);
for (int i = 0; i < SIZE; i++) {
printf("%.6f%s", Ax
[i
], (i
== SIZE
- 1) ? "]\n" : ", "); }
for (int i = 0; i < SIZE; i++) {
printf("%.6f%s", lambda_new
* y
[i
], (i
== SIZE
- 1) ? "]\n" : ", "); }
// 【指示通りに2行空ける】
// 2. ニュートン・ラフソン法を実行
printf("==================================================\n"); printf(" 【 手法 2 : ニュートン・ラフソン法 】 \n"); printf("==================================================\n"); printf("対象の特性方程式: f(λ) = λ^4 - 2.0λ^3 - 43.0λ^2 - 36.0λ + 130.0 = 0\n\n");
double initial_lambda[] = {10.0, 2.0, -2.5, -6.0};
for (int i = 0; i < 4; i++) {
solve_newton(i + 1, initial_lambda[i]);
}
printf("==================================================\n");
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPG1hdGguaD4KCiNkZWZpbmUgU0laRSA0CiNkZWZpbmUgRVBTSUxPTl9QT1dFUiAxZS05ICAKI2RlZmluZSBFUFNJTE9OX05FV1RPTiAxZS03ICAKI2RlZmluZSBNQVhfSVRFUiAxMDAwICAKCgpkb3VibGUgdmVjdG9yX25vcm0oZG91YmxlICp2LCBpbnQgbikgewogICAgZG91YmxlIHN1bSA9IDAuMDsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgICAgc3VtICs9IHZbaV0gKiB2W2ldOwogICAgfQogICAgcmV0dXJuIHNxcnQoc3VtKTsKfQoKdm9pZCBtYXRfdmVjX211bChkb3VibGUgQVtTSVpFXVtTSVpFXSwgZG91YmxlICp4LCBkb3VibGUgKnksIGludCBuKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgIHlbaV0gPSAwLjA7CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBuOyBqKyspIHsKICAgICAgICAgICAgeVtpXSArPSBBW2ldW2pdICogeFtqXTsKICAgICAgICB9CiAgICB9Cn0KCgpkb3VibGUgZihkb3VibGUgbGFtYmRhKSB7CiAgICByZXR1cm4gcG93KGxhbWJkYSwgNCkgLSAyLjAgKiBwb3cobGFtYmRhLCAzKSAtIDQzLjAgKiBwb3cobGFtYmRhLCAyKSAtIDM2LjAgKiBsYW1iZGEgKyAxMzAuMDsKfQoKZG91YmxlIGRmKGRvdWJsZSBsYW1iZGEpIHsKICAgIHJldHVybiA0LjAgKiBwb3cobGFtYmRhLCAzKSAtIDYuMCAqIHBvdyhsYW1iZGEsIDIpIC0gODYuMCAqIGxhbWJkYSAtIDM2LjA7Cn0KCnZvaWQgc29sdmVfbmV3dG9uKGludCBhdHRlbXB0LCBkb3VibGUgbGFtYmRhMCkgewogICAgZG91YmxlIGxhbWJkYSA9IGxhbWJkYTA7CiAgICBpbnQgaXRlciA9IDA7CgogICAgd2hpbGUgKGl0ZXIgPD0gTUFYX0lURVIpIHsKICAgICAgICBkb3VibGUgZl92YWwgPSBmKGxhbWJkYSk7CiAgICAgICAgZG91YmxlIGRmX3ZhbCA9IGRmKGxhbWJkYSk7CgogICAgICAgIGlmIChmYWJzKGRmX3ZhbCkgPCAxZS0xMikgcmV0dXJuOyAKCiAgICAgICAgZG91YmxlIGRlbHRhID0gZl92YWwgLyBkZl92YWw7CiAgICAgICAgbGFtYmRhIC09IGRlbHRhOwogICAgICAgIGl0ZXIrKzsKCiAgICAgICAgaWYgKGZhYnMoZGVsdGEpIDwgRVBTSUxPTl9ORVdUT04pIHsKICAgICAgICAgICAgcHJpbnRmKCLoqabooYwgIyVkICjliJ3mnJ/lgKQgJTUuMWYpIC0+IOWPjuadn+aIkOWKnyAoJTJk5ZueKSB8IOWbuuacieWApOinoyDOuyA9ICUuMTBmXG4iLCAKICAgICAgICAgICAgICAgICAgIGF0dGVtcHQsIGxhbWJkYTAsIGl0ZXIsIGxhbWJkYSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9Cn0KCi8vIC0tLSDjg6HjgqTjg7PplqLmlbAgLS0tCmludCBtYWluKCkgewogICAgLy8gMuOBpOebruOBruihjOWIlyBBCiAgICBkb3VibGUgQVtTSVpFXVtTSVpFXSA9IHsKICAgICAgICB7Mi4wLCAgMS4wLCAyLjAsICA1LjB9LAogICAgICAgIHszLjAsIC0zLjAsIDEuMCwgIDYuMH0sCiAgICAgICAgezAuMCwgIDEuMCwgMi4wLCAgNy4wfSwKICAgICAgICB7MS4wLCAgMS4wLCAzLjAsICAxLjB9CiAgICB9OwoKICAgIGRvdWJsZSB4W1NJWkVdLCB5W1NJWkVdLCBBeFtTSVpFXTsKICAgIGRvdWJsZSBsYW1iZGFfb2xkID0gMC4wLCBsYW1iZGFfbmV3ID0gMC4wOwoKICAgIC8vIDEuIOOBueOBjeS5l+azleOCkuacgOWIneOBq+Wun+ihjAogICAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CiAgICBwcmludGYoIiAgICAgICAgICAgICAg44CQIOaJi+azlSAxIDog44G544GN5LmX5rOVIOOAkSAgICAgICAgICAgICBcbiIpOwogICAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CiAgICAKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgaSsrKSB7CiAgICAgICAgeFtpXSA9IDEuMDsKICAgIH0KCiAgICBwcmludGYoIuWIneacn+ODmeOCr+ODiOODqyB4KDApOiBbJS4xZiwgJS4xZiwgJS4xZiwgJS4xZl1cblxuIiwgeFswXSwgeFsxXSwgeFsyXSwgeFszXSk7CiAgICBwcmludGYoIiUtNXMgfCAlLTEycyB8ICUtMTJzIHwgJS0zMHNcbiIsICJJdGVyIiwgIuWbuuacieWApCjmlrApIiwgIuW3ruWIhuWApCIsICLlm7rmnInjg5njgq/jg4jjg6t4KGspIik7CiAgICAKICAgIGludCBhY3R1YWxfaXRlcnMgPSAwOwogICAgZm9yIChpbnQgaXRlciA9IDE7IGl0ZXIgPD0gTUFYX0lURVI7IGl0ZXIrKykgewogICAgICAgIGFjdHVhbF9pdGVycyA9IGl0ZXI7CiAgICAgICAgbWF0X3ZlY19tdWwoQSwgeCwgeSwgU0laRSk7CgogICAgICAgIGRvdWJsZSBub3JtX3kgPSB2ZWN0b3Jfbm9ybSh5LCBTSVpFKTsKICAgICAgICBpZiAobm9ybV95IDwgMWUtMTIpIGJyZWFrOwogICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgaSsrKSB7CiAgICAgICAgICAgIHlbaV0gLz0gbm9ybV95OwogICAgICAgIH0KCiAgICAgICAgbWF0X3ZlY19tdWwoQSwgeSwgQXgsIFNJWkUpOwogICAgICAgIGRvdWJsZSBudW0gPSAwLjAsIGRlbiA9IDAuMDsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7IGkrKykgewogICAgICAgICAgICBudW0gKz0geVtpXSAqIEF4W2ldOwogICAgICAgICAgICBkZW4gKz0geVtpXSAqIHlbaV07CiAgICAgICAgfQogICAgICAgIGxhbWJkYV9uZXcgPSBudW0gLyBkZW47CiAgICAgICAgZG91YmxlIGRpZmYgPSBmYWJzKGxhbWJkYV9uZXcgLSBsYW1iZGFfb2xkKTsKCiAgICAgICAgaWYgKGl0ZXIgPD0gNSB8fCBpdGVyICUgNSA9PSAwKSB7CiAgICAgICAgICAgIHByaW50ZigiJS01ZCB8ICUtMTIuOGYgfCAlLTEyLjRlIHwgWyUuNWYsICUuNWYsICUuNWYsICUuNWZdXG4iLCAKICAgICAgICAgICAgICAgICAgIGl0ZXIsIGxhbWJkYV9uZXcsIGRpZmYsIHlbMF0sIHlbMV0sIHlbMl0sIHlbM10pOwogICAgICAgIH0KCiAgICAgICAgaWYgKGRpZmYgPCBFUFNJTE9OX1BPV0VSKSB7CiAgICAgICAgICAgIGlmIChpdGVyICUgNSAhPSAwICYmIGl0ZXIgPiA1KSB7CiAgICAgICAgICAgICAgICBwcmludGYoIiUtNWQgfCAlLTEyLjhmIHwgJS0xMi40ZSB8IFslLjVmLCAlLjVmLCAlLjVmLCAlLjVmXVxuIiwgCiAgICAgICAgICAgICAgICAgICAgICAgaXRlciwgbGFtYmRhX25ldywgZGlmZiwgeVswXSwgeVsxXSwgeVsyXSwgeVszXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7IGkrKykgewogICAgICAgICAgICB4W2ldID0geVtpXTsKICAgICAgICB9CiAgICAgICAgbGFtYmRhX29sZCA9IGxhbWJkYV9uZXc7CiAgICB9CgogICAgcHJpbnRmKCLlj43lvqnlm57mlbAgJWQg5Zue44Gn5Y+O5p2f44GX44G+44GX44Gf44CCXG4iLCBhY3R1YWxfaXRlcnMpOwogICAgcHJpbnRmKCJcbuacgOWkp+WbuuacieWApCAozrsxKSAgICAgICAgICA6ICUuMTBmXG4iLCBsYW1iZGFfbmV3KTsKICAgIHByaW50Zigi5a++5b+c44GZ44KL5Zu65pyJ44OZ44Kv44OI44OrICh4MSkgOiBbIik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IFNJWkU7IGkrKykgewogICAgICAgIHByaW50ZigiJS4xMGYlcyIsIHlbaV0sIChpID09IFNJWkUgLSAxKSA/ICJdXG4iIDogIiwgIik7CiAgICB9CgogICAgcHJpbnRmKCJcbiAgIOaknOiovDogQXgg44GoIM67eCDjga7mr5TovIMgICBcbiIpOwogICAgbWF0X3ZlY19tdWwoQSwgeSwgQXgsIFNJWkUpOwogICAgcHJpbnRmKCJBeCAgICA6IFsiKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgU0laRTsgaSsrKSB7CiAgICAgICAgcHJpbnRmKCIlLjZmJXMiLCBBeFtpXSwgKGkgPT0gU0laRSAtIDEpID8gIl1cbiIgOiAiLCAiKTsKICAgIH0KICAgIHByaW50ZigizrsgKiB4IDogWyIpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBTSVpFOyBpKyspIHsKICAgICAgICBwcmludGYoIiUuNmYlcyIsIGxhbWJkYV9uZXcgKiB5W2ldLCAoaSA9PSBTSVpFIC0gMSkgPyAiXVxuIiA6ICIsICIpOwogICAgfQoKCiAgICAvLyDjgJDmjIfnpLrpgJrjgorjgasy6KGM56m644GR44KL44CRCiAgICBwcmludGYoIlxuXG4iKTsKCgogICAgLy8gMi4g44OL44Ol44O844OI44Oz44O744Op44OV44K944Oz5rOV44KS5a6f6KGMCiAgICBwcmludGYoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKICAgIHByaW50ZigiICAgICAgICDjgJAg5omL5rOVIDIgOiDjg4vjg6Xjg7zjg4jjg7Pjg7vjg6njg5Xjgr3jg7Pms5Ug44CRICAgICBcbiIpOwogICAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CiAgICBwcmludGYoIuWvvuixoeOBrueJueaAp+aWueeoi+W8jzogZijOuykgPSDOu140IC0gMi4wzrteMyAtIDQzLjDOu14yIC0gMzYuMM67ICsgMTMwLjAgPSAwXG5cbiIpOwoKICAgIGRvdWJsZSBpbml0aWFsX2xhbWJkYVtdID0gezEwLjAsIDIuMCwgLTIuNSwgLTYuMH07CiAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewogICAgICAgIHNvbHZlX25ld3RvbihpICsgMSwgaW5pdGlhbF9sYW1iZGFbaV0pOwogICAgfQogICAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CgogICAgcmV0dXJuIDA7Cn0=
==================================================
【 手法 1 : べき乗法 】
==================================================
初期ベクトル x(0): [1.0, 1.0, 1.0, 1.0]
Iter | 固有値(新) | 差分値 | 固有ベクトルx(k)
1 | 7.58947368 | 7.5895e+00 | [0.59235, 0.41464, 0.59235, 0.35541]
2 | 7.97210119 | 3.8263e-01 | [0.59901, 0.42786, 0.53677, 0.41230]
3 | 7.72878414 | 2.4332e-01 | [0.59682, 0.44176, 0.55001, 0.38228]
4 | 7.86852048 | 1.3974e-01 | [0.60110, 0.42802, 0.54559, 0.39724]
5 | 7.78782087 | 8.0700e-02 | [0.59823, 0.43820, 0.54642, 0.38926]
10 | 7.81916110 | 4.7095e-03 | [0.59949, 0.43391, 0.54638, 0.39217]
15 | 7.81737213 | 2.6407e-04 | [0.59941, 0.43420, 0.54635, 0.39202]
20 | 7.81747243 | 1.4759e-05 | [0.59941, 0.43418, 0.54635, 0.39203]
25 | 7.81746682 | 8.2460e-07 | [0.59941, 0.43418, 0.54635, 0.39203]
30 | 7.81746714 | 4.6068e-08 | [0.59941, 0.43418, 0.54635, 0.39203]
35 | 7.81746712 | 2.5737e-09 | [0.59941, 0.43418, 0.54635, 0.39203]
37 | 7.81746712 | 8.1175e-10 | [0.59941, 0.43418, 0.54635, 0.39203]
反復回数 37 回で収束しました。
最大固有値 (λ1) : 7.8174671191
対応する固有ベクトル (x1) : [0.5994100822, 0.4341839804, 0.5463547658, 0.3920309865]
検証: Ax と λx の比較
Ax : [4.685869, 3.394219, 4.271110, 3.064689]
λ * x : [4.685869, 3.394219, 4.271110, 3.064689]
==================================================
【 手法 2 : ニュートン・ラフソン法 】
==================================================
対象の特性方程式: f(λ) = λ^4 - 2.0λ^3 - 43.0λ^2 - 36.0λ + 130.0 = 0
試行 #1 (初期値 10.0) -> 収束成功 ( 6回) | 固有値解 λ = 7.8174671194
試行 #2 (初期値 2.0) -> 収束成功 ( 5回) | 固有値解 λ = 1.3593330358
試行 #3 (初期値 -2.5) -> 収束成功 ( 4回) | 固有値解 λ = -2.7864676299
試行 #4 (初期値 -6.0) -> 収束成功 ( 7回) | 固有値解 λ = -4.3903325253
==================================================