#include <stdio.h>
#include <math.h>
void gauss3(double A[3][3], double b[3], double x[3]) {
for (int i = 0; i < 3; i++) {
// ピボット行の正規化
double pivot = A[i][i];
for (int j = 0; j < 3; j++) A[i][j] /= pivot;
b[i] /= pivot;
// 他の行の消去 (掃き出し処理)
for (int k = 0; k < 3; k++) {
if (k == i) continue;
double factor = A[k][i];
for (int j = 0; j < 3; j++) A[k][j] -= factor * A[i][j];
b[k] -= factor * b[i];
}
}
for (int i = 0; i < 3; i++) x[i] = b[i];
}
int main() {
// 与えられたデータセット (8組)
double xval[8] = {0.15708, 0.23982, 0.37400, 0.57120, 0.82674, 1.04720, 1.23200, 1.43452};
double yval[8] = {0.98769, 0.97138, 0.93087, 0.84125, 0.67728, 0.50000, 0.33236, 0.13586};
double S2 = 0, S4 = 0, S6 = 0, S8 = 0;
double Sy = 0, S2y = 0, S4y = 0;
// 正規方程式に必要な各合計値の計算
for (int i = 0; i < 8; i++) {
double x2 = xval[i] * xval[i];
double x4 = x2 * x2;
double x6 = x4 * x2;
double x8 = x4 * x4;
S2 += x2;
S4 += x4;
S6 += x6;
S8 += x8;
Sy += yval[i];
S2y += x2 * yval[i];
S4y += x4 * yval[i];
}
// 係数行列 A と右辺ベクトル b の設定
double A[3][3] = {
{8, S2, S4},
{S2, S4, S6},
{S4, S6, S8}
};
double b[3] = {Sy, S2y, S4y};
double sol[3];
// 掃き出し法 (ガウスの消去法) で連立方程式を解く
gauss3(A, b, sol);
// 結果の出力
printf("=========================================\n"); printf("モデル (2): y = b1 + b2*x^2 + b3*x^4 計算結果\n"); printf("=========================================\n"); printf(" b1 = %.6f\n", sol
[0]); printf(" b2 = %.6f\n", sol
[1]); printf(" b3 = %.6f\n", sol
[2]);
// 残差平方和 (誤差の2乗和 E) の計算
double E = 0;
for (int i = 0; i < 8; i++) {
double x2 = xval[i] * xval[i];
double x4 = x2 * x2;
double yhat = sol[0] + sol[1] * x2 + sol[2] * x4;
double diff = yval[i] - yhat;
E += diff * diff;
}
printf("\n近似式による偏差の2乗和 (誤差 E):\n");
// Excelプロット用の予測値出力
printf("\n近似式による y の予測値 (Excelグラフ作成用):\n"); printf("x 値\t\t計算された y 予測値\n"); for (int i = 0; i < 8; i++) {
double x2 = xval[i] * xval[i];
double x4 = x2 * x2;
double yhat = sol[0] + sol[1] * x2 + sol[2] * x4;
printf("%.5f\t%.6f\n", xval
[i
], yhat
); }
printf("=========================================\n");
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+Cgp2b2lkIGdhdXNzMyhkb3VibGUgQVszXVszXSwgZG91YmxlIGJbM10sIGRvdWJsZSB4WzNdKSB7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewogICAgICAgIC8vIOODlOODnOODg+ODiOihjOOBruato+imj+WMlgogICAgICAgIGRvdWJsZSBwaXZvdCA9IEFbaV1baV07CiAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCAzOyBqKyspIEFbaV1bal0gLz0gcGl2b3Q7CiAgICAgICAgYltpXSAvPSBwaXZvdDsKCiAgICAgICAgLy8g5LuW44Gu6KGM44Gu5raI5Y67ICjmjoPjgY3lh7rjgZflh6bnkIYpCiAgICAgICAgZm9yIChpbnQgayA9IDA7IGsgPCAzOyBrKyspIHsKICAgICAgICAgICAgaWYgKGsgPT0gaSkgY29udGludWU7CiAgICAgICAgICAgIGRvdWJsZSBmYWN0b3IgPSBBW2tdW2ldOwogICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDM7IGorKykgQVtrXVtqXSAtPSBmYWN0b3IgKiBBW2ldW2pdOwogICAgICAgICAgICBiW2tdIC09IGZhY3RvciAqIGJbaV07CiAgICAgICAgfQogICAgfQoKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB4W2ldID0gYltpXTsKfQoKaW50IG1haW4oKSB7CiAgICAvLyDkuI7jgYjjgonjgozjgZ/jg4fjg7zjgr/jgrvjg4Pjg4ggKDjntYQpCiAgICBkb3VibGUgeHZhbFs4XSA9IHswLjE1NzA4LCAwLjIzOTgyLCAwLjM3NDAwLCAwLjU3MTIwLCAwLjgyNjc0LCAxLjA0NzIwLCAxLjIzMjAwLCAxLjQzNDUyfTsKICAgIGRvdWJsZSB5dmFsWzhdID0gezAuOTg3NjksIDAuOTcxMzgsIDAuOTMwODcsIDAuODQxMjUsIDAuNjc3MjgsIDAuNTAwMDAsIDAuMzMyMzYsIDAuMTM1ODZ9OwoKICAgIGRvdWJsZSBTMiA9IDAsIFM0ID0gMCwgUzYgPSAwLCBTOCA9IDA7CiAgICBkb3VibGUgU3kgPSAwLCBTMnkgPSAwLCBTNHkgPSAwOwoKICAgIC8vIOato+imj+aWueeoi+W8j+OBq+W/heimgeOBquWQhOWQiOioiOWApOOBruioiOeulwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsKICAgICAgICBkb3VibGUgeDIgPSB4dmFsW2ldICogeHZhbFtpXTsKICAgICAgICBkb3VibGUgeDQgPSB4MiAqIHgyOwogICAgICAgIGRvdWJsZSB4NiA9IHg0ICogeDI7CiAgICAgICAgZG91YmxlIHg4ID0geDQgKiB4NDsKCiAgICAgICAgUzIgKz0geDI7CiAgICAgICAgUzQgKz0geDQ7CiAgICAgICAgUzYgKz0geDY7CiAgICAgICAgUzggKz0geDg7CgogICAgICAgIFN5ICs9IHl2YWxbaV07CiAgICAgICAgUzJ5ICs9IHgyICogeXZhbFtpXTsKICAgICAgICBTNHkgKz0geDQgKiB5dmFsW2ldOwogICAgfQoKICAgIC8vIOS/guaVsOihjOWIlyBBIOOBqOWPs+i+uuODmeOCr+ODiOODqyBiIOOBruioreWumgogICAgZG91YmxlIEFbM11bM10gPSB7CiAgICAgICAgezgsICBTMiwgUzR9LAogICAgICAgIHtTMiwgUzQsIFM2fSwKICAgICAgICB7UzQsIFM2LCBTOH0KICAgIH07CgogICAgZG91YmxlIGJbM10gPSB7U3ksIFMyeSwgUzR5fTsKICAgIGRvdWJsZSBzb2xbM107CgogICAgLy8g5o6D44GN5Ye644GX5rOVICjjgqzjgqbjgrnjga7mtojljrvms5UpIOOBp+mAo+eri+aWueeoi+W8j+OCkuino+OBjwogICAgZ2F1c3MzKEEsIGIsIHNvbCk7CgogICAgLy8g57WQ5p6c44Gu5Ye65YqbCiAgICBwcmludGYoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKICAgIHByaW50Zigi44Oi44OH44OrICgyKTogeSA9IGIxICsgYjIqeF4yICsgYjMqeF40IOioiOeul+e1kOaenFxuIik7CiAgICBwcmludGYoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsKICAgIHByaW50Zigi5rGC44KB44KJ44KM44Gf5L+C5pWwOlxuIik7CiAgICBwcmludGYoIiAgYjEgPSAlLjZmXG4iLCBzb2xbMF0pOwogICAgcHJpbnRmKCIgIGIyID0gJS42ZlxuIiwgc29sWzFdKTsKICAgIHByaW50ZigiICBiMyA9ICUuNmZcbiIsIHNvbFsyXSk7CgogICAgLy8g5q6L5beu5bmz5pa55ZKMICjoqqTlt67jga4y5LmX5ZKMIEUpIOOBruioiOeulwogICAgZG91YmxlIEUgPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsKICAgICAgICBkb3VibGUgeDIgPSB4dmFsW2ldICogeHZhbFtpXTsKICAgICAgICBkb3VibGUgeDQgPSB4MiAqIHgyOwogICAgICAgIGRvdWJsZSB5aGF0ID0gc29sWzBdICsgc29sWzFdICogeDIgKyBzb2xbMl0gKiB4NDsKICAgICAgICBkb3VibGUgZGlmZiA9IHl2YWxbaV0gLSB5aGF0OwogICAgICAgIEUgKz0gZGlmZiAqIGRpZmY7CiAgICB9CgogICAgcHJpbnRmKCJcbui/keS8vOW8j+OBq+OCiOOCi+WBj+W3ruOBrjLkuZflkowgKOiqpOW3riBFKTpcbiIpOwogICAgcHJpbnRmKCIgIEUgPSAlLjEwZlxuIiwgRSk7CgogICAgLy8gRXhjZWzjg5fjg63jg4Pjg4jnlKjjga7kuojmuKzlgKTlh7rlipsKICAgIHByaW50ZigiXG7ov5HkvLzlvI/jgavjgojjgosgeSDjga7kuojmuKzlgKQgKEV4Y2Vs44Kw44Op44OV5L2c5oiQ55SoKTpcbiIpOwogICAgcHJpbnRmKCJ4IOWApFx0XHToqIjnrpfjgZXjgozjgZ8geSDkuojmuKzlgKRcbiIpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsKICAgICAgICBkb3VibGUgeDIgPSB4dmFsW2ldICogeHZhbFtpXTsKICAgICAgICBkb3VibGUgeDQgPSB4MiAqIHgyOwogICAgICAgIGRvdWJsZSB5aGF0ID0gc29sWzBdICsgc29sWzFdICogeDIgKyBzb2xbMl0gKiB4NDsKICAgICAgICBwcmludGYoIiUuNWZcdCUuNmZcbiIsIHh2YWxbaV0sIHloYXQpOwogICAgfQogICAgcHJpbnRmKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIik7CgogICAgcmV0dXJuIDA7Cn0=