gslで線形方程式、連立一次方程式をとく。
#include<stdio.h> #include<gsl/gsl_linalg.h> void solve(double** m,double* v,int len){ using namespace std; int s; double *mb; int k=0; mb=(double*)malloc(sizeof(double)*len*len); for(int i=0;i<len;i++){ for(int j=0;j<len;j++){ mb[k]=m[i][j]; k++; } } gsl_matrix_view m2=gsl_matrix_view_array(mb,len,len); gsl_vector_view v2=gsl_vector_view_array(v,len); gsl_vector *x=gsl_vector_alloc(len); gsl_permutation *p =gsl_permutation_alloc(len); gsl_linalg_LU_decomp(&m2.matrix,p,&s); gsl_linalg_LU_solve(&m2.matrix,p,&v2.vector,x); printf("x=\n"); gsl_vector_fprintf(stdout,x,"%g"); gsl_permutation_free(p); gsl_vector_free(x); // return *v; } int main(){ double** m; double* v; double* x; int len=3; m=(double**) malloc(sizeof(double*)*(len)); v=(double*) malloc(sizeof(double)*(len)); x=(double*) malloc(sizeof(double)*(len)); for(int i=0;i<len;i++){ m[i]=(double*)malloc(sizeof(double)*(len)); } m[0][0]=3; m[0][1]=2; m[0][2]=5; m[1][0]=7; m[1][1]=4; m[1][2]=1; m[2][0]=9; m[2][1]=2; m[2][2]=6; v[0]=2; v[1]=4; v[2]=7; solve(m,v,3); }
x=
0.818182
マイナス0.454545
0.0909091
帰り値あり
#include<stdio.h> #include<gsl/gsl_linalg.h> void solve(double** m,double* v,int len,double* output){ using namespace std; int s; double *mb; int k=0; mb=(double*)malloc(sizeof(double)*len*len); for(int i=0;i<len;i++){ for(int j=0;j<len;j++){ // printf("%lf\n",m[i][j]); mb[k]=m[i][j]; k++; } } gsl_matrix_view m2=gsl_matrix_view_array(mb,len,len); gsl_vector_view v2=gsl_vector_view_array(v,len); gsl_vector *x=gsl_vector_alloc(len); gsl_permutation *p =gsl_permutation_alloc(len); gsl_linalg_LU_decomp(&m2.matrix,p,&s); gsl_linalg_LU_solve(&m2.matrix,p,&v2.vector,x); printf("x=\n"); gsl_vector_fprintf(stdout,x,"%g"); gsl_permutation_free(p); //gsl_vector_free(x); for(int i=0;i<len;i++){ output[i]=gsl_vector_get(x,i); }; // return *v; } int main(){ double** m; double* v; double* x; double* output; int time_length=3; m=(double**) malloc(sizeof(double*)*(time_length)); v=(double*) malloc(sizeof(double)*(time_length)); x=(double*) malloc(sizeof(double)*(time_length)); output=(double*) malloc(sizeof(double)*(time_length)); for(int i=0;i<time_length;i++){ m[i]=(double*)malloc(sizeof(double)*(time_length)); } m[0][0]=3; m[0][1]=2; m[0][2]=5; m[1][0]=7; m[1][1]=4; m[1][2]=1; m[2][0]=9; m[2][1]=2; m[2][2]=6; /* m[0][0]=1; m[0][1]=0; m[0][2]=0; m[1][0]=0; m[1][1]=1; m[1][2]=0; m[2][0]=0; m[2][1]=0; m[2][2]=1; */ v[0]=2; v[1]=4; v[2]=7; solve(m,v,3,output); printf("answer\n"); for(int i;i<time_length;i++){ printf("%lf\n",output[i]); } }
出力
x=
0.818182
- 0.454545
0.0909091
answer
0.818182
- 0.454545
0.090909