逆行列

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
tui

逆行列

#1

投稿記事 by tui » 2年前

このプログラムはayの逆行列を求めたのちその逆行列とR₀の行列を掛け算してclt[4][2]を求めたいと考えていますがうまくいきません

アドバイスお願いします。


コード:

#include <stdlib.h>
#include<iostream>
#include<cmath>


void Inversematrix(double a[4][4]);
void matrixmultiplication(double x[4][2], double y[4][4], double xy[4][2]);
double inv_a[4][4];

int main(int argc, char **argv)
{

    double t[4] = { 0.0,0.2,0.6,1.0 }, R₀[4][2] = { { 1,2 },{ 2,3 },{ 3,1 },{ 5,1 } };
    double R₀ay[4][2],clt[4][2];
    double ay[4][4] = { { pow((1 - t[0]), 3), 3 * pow((1 - t[0]), 2)*t[0], 3 * (1 - t[0])*pow(t[0], 2), pow(t[0], 3)},
                        { pow((1 - t[1]), 3), 3 * pow((1 - t[1]), 2)*t[1], 3 * (1 - t[1])*pow(t[1], 2), pow(t[1], 3)},
                        { pow((1 - t[2]), 3), 3 * pow((1 - t[2]), 2)*t[2], 3 * (1 - t[2])*pow(t[2], 2), pow(t[2], 3)},
                        { pow((1 - t[3]), 3), 3 * pow((1 - t[3]), 2)*t[3], 3 * (1 - t[3])*pow(t[3], 2), pow(t[3], 3)}}; //入力用の配列(R₀のxの値を代入

       Inversematrix(ay);
     
 matrixmultiplication(R₀,ay,R₀ay);

    return 0;
}

void Inversematrix(double a[4][4])
{
    double inv_a[4][4],t[4],R₀[2][2]; //ここに逆行列が入る
    double buf; //一時的なデータを蓄える
    int i, j, k; //カウンタ
    int n = 4;

    //単位行列を作る
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            inv_a[i][j] = (i == j) ? 1.0 : 0.0;
        }
    }

    //掃き出し法
    for (i = 0; i < n; i++) {
        buf = 1 / a[i][i];
        for (j = 0; j < n; j++) {
            a[i][j] *= buf;
            inv_a[i][j] *= buf;
        }
        for (j = 0; j < n; j++) {
            if (i != j) {
                buf = a[j][i];
                for (k = 0; k < n; k++) {
                    a[j][k] -= a[i][k] * buf;
                    inv_a[j][k] -= inv_a[i][k] * buf;
                }
            }
        }
    }
    //逆行列を出力
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            printf(" %f", inv_a[i][j]);
        }
        printf("\n");
    }

}

void matrixmultiplication(double x[4][2],double y[4][4], double xy[4][2])
{


    int i, j, k;

    for (i = 0; i < 4; i++) {
        for (j = 0; j < 2; j++) {
            xy[i][j] = 0;
            for (k = 0; k < 4; k++) {
                xy[i][j] += x[i][k] * y[k][j];
            }
        }
    }

    for (i = 0; i < 4; i++) {
        for (j = 0; j < 2; j++) {
            printf("%4d", xy[i][j]);
        }
        putchar('\n');
    }
}

maru
記事: 150
登録日時: 8年前

Re: 逆行列

#2

投稿記事 by maru » 2年前

「うまくいきません」では、どううまくいっていないのかわかりません。

というのはさておき、実行してみたところ、
Inversematrix(ay);
で ay に単位行列が返ってきています。これが質問者の意図と合っていないのではないでしょうか?

ところで、デバッグという言葉はご存知ですか?

tui

Re: 逆行列

#3

投稿記事 by tui » 2年前

maru さんが書きました:「うまくいきません」では、どううまくいっていないのかわかりません。

というのはさておき、実行してみたところ、
Inversematrix(ay);
で ay に単位行列が返ってきています。これが質問者の意図と合っていないのではないでしょうか?

ところで、デバッグという言葉はご存知ですか?

Inversematrix(ay)では、ayの逆行列が返ってきてそれにR0を掛けたいと考えています。

うまくいかないというのは、値が入らないということです

maru
記事: 150
登録日時: 8年前

Re: 逆行列

#4

投稿記事 by maru » 2年前

tui さんが書きました:Inversematrix(ay)では、ayの逆行列が返ってきてそれにR0を掛けたいと考えています。
うまくいかないというのは、値が入らないということです
だから、Inversematrix(ay)では、ay に単位行列が返ってきているって書いてるでしょ。
inv_a に逆行列を作成しているが、その過程で ay には単位行列が作成される。
inv_a に作成された逆行列を ay にコピーしていないから matrixmultiplication では単位行列が使用される。

「値が入らない」って言っても、何らかの値は入っているはず。
意図と違った値が入っているのなら、そのこと(期待値と実際の値)を書くべきです。
そうしないと読んでいる人にはわかりません。
フォーラムルールを御一読ください。

返信

“C言語何でも質問掲示板” へ戻る