###実現したいこと
関数onestep
内で計算したe0
の値をmain
内で出力したい。
###問題点
関数の関数の部分でのやり取りがうまくいかない。
multiIter
からonestep
に値を渡すところでうまくいっていないのだと思います。
gyouretu.cc: In function 'void ex::multiIter(int, double (*)[200], int, double*)': gyouretu.cc:74:25: error: cannot convert 'double**' to 'double*' 74 | onestep(n,A,&e0); | ^~~ | | | double** gyouretu.cc:31:47: note: initializing argument 3 of 'void ex::onestep(int, double (*)[200], double*)' 31 | void onestep(int n,double A[N][N],double *e0){ | ~~~~~~~~^~
###試したこと
そこで、onestep
内のe0
をdouble **e0
にしてみたらプログラムが強制終了してしまいました。
最大固有値の近似値を出すところです。
どこを直せばmain
内までe0
を持ってくることができるのか教えてください。
###コード
C++
1#include<cstdio> 2#include<cstdlib> 3#include<cmath> 4 5#define N 200 6double A[N][N]; 7double x0[N]; 8 9namespace ex{ 10 double y0[N],y1[N]; 11 12 //乱数発生 13 double uran(){ 14 double v=rand(); 15 return v/RAND_MAX; 16 } 17 18 //ノルム計算 19 double norm(int n,double x[]){ 20 double s=0; 21 int i; 22 for(i=0;i<n;i++){ 23 s=s+x[i]*x[i]; 24 } 25 return sqrt(s); 26 } 27 28 //1回のべき乗法の計算 29 void onestep(int n,double A[N][N],double *e0){ 30 double u0; 31 int i,j; 32 printf("べき乗法:\n"); 33 for(i=0;i<n;i++){ 34 printf("x[%d]=%f ",i,x0[i]); 35 } 36 printf("\n"); 37 for(i=0;i<n;i++){ 38 for(j=0;j<n;j++){ 39 printf("%f ",A[i][j]); 40 } 41 printf("\n"); 42 } 43 //y=Ax 44 for(i=0;i<n;i++){ 45 //printf("AXi=%d\n",i); 46 y0[i]=0; 47 for(j=0;j<n;j++){ 48 y0[i]+=A[i][j]*x0[j]; 49 //printf("y0=%f\n",y0[i]); 50 } 51 } 52 for(i=0;i<n;i++){ 53 printf("y[%d]=%f ",i,y0[i]); 54 } 55 e0=0; 56 for(i=0;i<n;i++){ 57 *e0+=x0[i]*y0[i]; //最大固有値の近似値 58 } 59 printf("e0=%.10g\n",e0); 60 u0=norm(n,y0); //||y0|| 61 for(i=0;i<n;i++){ 62 x0[i]=y0[i]/u0; //x=y/||y|| 63 } 64 } 65 66 //べき乗法の指示 67 void multiIter(int n,double A[N][N],int kmax,double *e0){ 68 int k; 69 //反復してべき乗法 70 for(k=0;k<kmax;k++){ 71 //printf("k=%d\n",k); 72 onestep(n,A,&e0); 73 } 74 printf("e0=%f\n",e0); 75 } 76} 77 78int main(int ac,char**av) 79{ 80 int i,j,n,kmax=3000; 81 double e0; 82 if(ac>1){ 83 kmax=atoi(av[1]); //文字列をint型に変換 84 } 85 printf("n="); 86 scanf("%d",&n); 87 printf("行列式Aを入力:\n"); 88 for(i=0;i<n;i++){ 89 for(j=0;j<n;j++){ 90 scanf("%lf",&A[i][j]); 91 } 92 } 93 printf("ベクトルbを入力:\n"); 94 for(i=0;i<n;i++){ 95 scanf("%lf",&x0[i]); 96 } 97 98 ex::multiIter(n,A,kmax,&e0); 99 printf("最大固有値: %f\n",e0); 100}
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/23 07:41