ソリューション・エクスプローラー構成
lu_mod.h #ifndef LU_H #define LU_H #include "vector.h" #include "matrix.h" /** * @brief LU分解 * @param[in,out] A LU分解対象行列,LU分解後の行列 * @return 行列式 * @attention LU分解後,Aの非対角成分の下三角成分はLで,Aの非対角成分の上三角成分はUで,Aの対角成分はLの対角成分で上書きされる */ double lu_decomp_mod(matrix* A); /** * @brief LU分解を用いて連立方程式を解く * @param[in,out] b 右辺ベクトル,解ベクトル * @param[in] A lu_decomp_mod後のLU分解行列 * @attention bは解ベクトルで上書きされる */ void lu_solve_mod(vector* b, const matrix* A); #endif /* LU_H */ |
lu_mod.c
#include "lu_mod.h"
double lu_decomp_mod(matrix* A) {
/* ここを実装せよ */
}
void lu_solve_mod(vector* b, const matrix* A) {
/* ここを実装せよ */
}
|
lu_mod_test.c
#include <stdlib.h>
#include "vector.h"
#include "matrix.h"
#include "lu_mod.h"
/**
* / 8 16 24 32 \
* A = | 2 7 12 17 |
* | 6 17 32 59 |
* \ 7 22 46 105 /
*
* / 160 \
* b = | 70 |
* | 198 |
* \ 291 /
* @param[out] A 係数行列
* @param[out] b 右辺ベクトル
*/
void set_equation1(matrix* A, vector* b) {
/* 行列サイズ指定 */
int N = 4;
/* 領域確保 */
matrix_new(N, N, A);
vector_new(N, b);
/* 係数行列要素指定 */
A->val[0][0] = 8;
A->val[0][1] = 16;
A->val[0][2] = 24;
A->val[0][3] = 32;
A->val[1][0] = 2;
A->val[1][1] = 7;
A->val[1][2] = 12;
A->val[1][3] = 17;
A->val[2][0] = 6;
A->val[2][1] = 17;
A->val[2][2] = 32;
A->val[2][3] = 59;
A->val[3][0] = 7;
A->val[3][1] = 22;
A->val[3][2] = 46;
A->val[3][3] = 105;
/* 右辺ベクトル要素指定 */
b->val[0] = 160;
b->val[1] = 70;
b->val[2] = 198;
b->val[3] = 291;
}
/**
* / 3 2 1 \
* A = | 2 4 3 |
* \ 1 3 5 /
*
* / 6 \
* b = | 10 |
* \ 12.5 /
* @param[out] A 係数行列
* @param[out] b 右辺ベクトル
*/
void set_equation2(matrix* A, vector* b) {
/* 行列サイズ指定 */
int N = 3;
/* 領域確保 */
matrix_new(N, N, A);
vector_new(N, b);
/* 係数行列要素指定 */
A->val[0][0] = 3;
A->val[0][1] = 2;
A->val[0][2] = 1;
A->val[1][0] = 2;
A->val[1][1] = 4;
A->val[1][2] = 3;
A->val[2][0] = 1;
A->val[2][1] = 3;
A->val[2][2] = 5;
/* 右辺ベクトル要素指定 */
b->val[0] = 6;
b->val[1] = 10;
b->val[2] = 12.5;
}
/**
* / 1 2 2 \
* A = | 3 6 2 |
* \ 1 1 1 /
*
* / 1 \
* b = | 7 |
* \ 5 /
* @param[out] A 係数行列
* @param[out] b 右辺ベクトル
*/
void set_equation3(matrix* A, vector* b) {
/* 行列サイズ指定 */
int N = 3;
/* 領域確保 */
matrix_new(N, N, A);
vector_new(N, b);
/* 係数行列要素指定 */
A->val[0][0] = 1;
A->val[0][1] = 2;
A->val[0][2] = 2;
A->val[1][0] = 3;
A->val[1][1] = 6;
A->val[1][2] = 2;
A->val[2][0] = 1;
A->val[2][1] = 1;
A->val[2][2] = 1;
/* 右辺ベクトル要素指定 */
b->val[0] = 1;
b->val[1] = 7;
b->val[2] = 5;
}
int main(void) {
double det; /* 行列式 */
matrix A; /* 係数行列 */
vector b; /* 右辺ベクトル */
char sw[2]; /* 方程式切替スイッチ */
printf("input 1,2,3 ? ");
fgets(sw, sizeof (sw), stdin);
switch (atoi(sw)) {
case 1:
set_equation1(&A, &b);
break;
case 2:
set_equation2(&A, &b);
break;
case 3:
set_equation3(&A, &b);
break;
default:
return EXIT_FAILURE;
}
/* 係数行列表示 */
printf("A =\n");
matrix_print(&A, "%f");
/* 右辺ベクトル表示 */
printf("b = ");
vector_print(&b, "%f");
/* LU分解 */
det = lu_decomp_mod(&A);
/* LU分解後の係数行列を表示 */
printf("A =\n");
matrix_print(&A, "%f");
/* 行列式表示 */
printf("det = %3.0f\n", det);
/* LU分解を用いて連立方程式を解く */
lu_solve_mod(&b, &A);
/* 解ベクトル表示 */
printf("b = ");
vector_print(&b, "%f");
/* 領域解放 */
matrix_delete(&A);
vector_delete(&b);
return EXIT_SUCCESS;
}
|
|
input 1,2,3 ? 1 A = [8.000000, 16.000000, 24.000000, 32.000000 2.000000, 7.000000, 12.000000, 17.000000 6.000000, 17.000000, 32.000000, 59.000000 7.000000, 22.000000, 46.000000, 105.000000] b = [160.000000, 70.000000, 198.000000, 291.000000] A = [8.000000, 2.000000, 3.000000, 4.000000 2.000000, 3.000000, 2.000000, 3.000000 6.000000, 5.000000, 4.000000, 5.000000 7.000000, 8.000000, 9.000000, 8.000000] det = 768 b = [4.000000, 3.000000, 2.000000, 1.000000]