- 締切済み
c++について質問です
c++について質問です. 以下を実行するとerror C2601: 'f' : ローカル関数の定義が正しくありません。 と出てしまいます. 原因はmainの中に積分計算の関数を入れているせいだと思うのですが,どのように解決すればよいでしょうか? 計算の都合上,積分はmain関数内で行う必要があります. お時間のある方,よろしくお願いします. //hello2.cpp #define _COMPLEX_DEFINED #include <iostream> #include <string> #include "complex.h" #include "bessel.h" #include <math.h> #include <iostream.h> #include <cmath> #include <stdio.h> #define RADIAN(ARC) ((ARC) * 3.14159 / 180) using namespace std; int main(void) { const double pi=3.141592654; const double I0=2829; const double r0=0; const double z=0; const double B1=6.07*pow(10,7); int k; double omega,freq,x; double R,Rk; double lambdag,ag; double lambda1,a1,l1; double lambda2,a2,l2; double p,p2,pg; double a11,a21,ag1,Rk1,l11,l21,p11,p21; double Km,Kn,Kg,am; complex r1,g,S2; complex sigma1,sigma2,sigmag; complex G,P,B,H; complex RR,NI,NI2,NI3,BE; double ANS,sumRIm,sumRRe; int x1; double r,r00,r001,r01; double imag(),real(); printf("接触熱抵抗"); scanf("%lf",&R); printf("加熱光半径(10^-6)×"); scanf("%lf",&Rk1); Rk=Rk1*pow(10,-6); printf("1層目熱伝導率"); scanf("%lf",&lambda1); printf("1層目温度伝導率(10^-6)×"); scanf("%lf",&a11); a1=a11*pow(10,-6); printf("1層目厚み(10^-6)×"); scanf("%lf",&l11); l1=l11*pow(10,-6); printf("2層目熱伝導率"); scanf("%lf",&lambda2); printf("2層目温度伝導率(10^-6)×"); scanf("%lf",&a21); a2=a21*pow(10,-6); printf("2層目厚み(10^-6)×"); scanf("%lf",&l21); l2=l21*pow(10,-6); printf("バッキング熱伝導率"); scanf("%lf",&lambdag); printf("バッキング温度伝導率(10^-6)×"); scanf("%lf",&ag1); ag=ag1*pow(10,-6); printf("1層目半径境界(10^-6)×"); scanf("%lf",&p11); p=p11*pow(10,-6); printf("2層目半径境界(10^-6)×"); scanf("%lf",&p21); p2=p21*pow(10,-6); printf("バッキング半径境界"); scanf("%lf",&pg); printf("am範囲"); scanf("%d", &x1); FILE *file; file = fopen("test929.csv","w"); for (x=1; x<=7; x+=0.1) { freq=pow(10,x); omega=2*pi*freq; sumRIm=0; sumRRe=0; for (int i=1; i<=x1; i++) { am=(double)i; Km=am/p; Kn=am/p2; Kg=am/pg; sigma1=cpow(pow(Km,2)+complex(0,omega/a1),0.5); sigma2=cpow(pow(Kn,2)+complex(0,omega/a2),0.5); sigmag=cpow(pow(Kg,2)+complex(0,omega/ag),0.5); r1=B1/sigma1; g=(lambdag*sigmag)/(lambda1*sigma1); S2=(lambda2*sigma2)/(lambda1*sigma1); G = (1/(2*(S2+g)))*((S2-g)*(-1+R*lambda2*sigma2+S2)*cexp(-2*sigma2*l2)-(S2+g)*(1+R*lambda2*sigma2+S2)); P = (1/(2*(S2+g)))*((S2-g)*(1-R*lambda2*sigma2+S2)*cexp(-2*sigma2*l2)-(S2+g)*(-1-R*lambda2*sigma2+S2)); B = (1/(2*(S2+g)))*((S2-g)*((1-R*lambda2*sigma2)*r1+S2)*cexp(-2*sigma2*l2)-(S2+g)*(-1*(1+R*lambda2*sigma2)*r1+S2)); H = ((g+r1)*cexp(sigma1*l1)*G+(1-g)*cexp(-1*B1*l1)*B)/((1-g)*cexp(-1*sigma1*l1)*P+(1+g)*cexp(sigma1*l1)*G); r=0; r00=0; r001=1; r01=0.00005; BE=1; NI= exp(-1*(2*pow(r01,2)/pow(Rk,2)))*j0(Km*r)*r01; NI2=2*pi*r001*j0(Km*r00); NI3=cpow(j1(am),-2); RR= (B1*I0/(2*lambda1*(cpow(sigma1,2)-pow(B1,2))))*2*pow(p,-2)*cpow(BE,-2)*NI*(1/(1-g))*(-2*H+r1+1)*NI2*cexp(sigmag*z); sumRIm+= RR.imag(); sumRRe+= RR.real(); } ANS=-atan((sumRIm/sumRRe))*(180/pi); printf("%f\n",ANS); fprintf(file,"%f\n",ANS); } /* nを大きくすると精度が上がる */ const int n = 100000; const double Kmm=100; /* 積分する関数 f(w) */ double f(double w){ return 2*pi*w*j0(Kmm*w); } /* 積分の範囲 w0からw_max */ const double w0 = 0; // x0を0としないのは、xが0の時に発散するため const double w_max = 0.4; int kk; /* シンプソン法による積分計算 */ double simpson(double w0,double w_max){ double delta = (w_max - w0)/n; double a; a = f(w0); a += f(w0 + delta * n); int i; for(i=1; i<n; i+=2){ a += 4.0 * f(w0 + delta * i); } for(i=2; i<n; i+=2){ a += 2.0 * f(w0 + delta * i); } return a*delta/3.0; } printf("%f\n",simpson(w0,w_max)); scanf("%d",&k);// fclose(file); return 0; }
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- jacta
- ベストアンサー率26% (845/3158)
C++では、原則として関数を入れ子にすることはできないのです。 どうしてもやりたければ、次のようにしてください。 struct _ { /* nを大きくすると精度が上がる */ static const int n = 100000; static const double Kmm=100; /* 積分する関数 f(w) */ static double f(double w){ return 2*pi*w*j0(Kmm*w); } /* 積分の範囲 w0からw_max */ static const double w0 = 0; // x0を0としないのは、xが0の時に発散するため static const double w_max = 0.4; /* シンプソン法による積分計算 */ static double simpson(double w0,double w_max){ double delta = (w_max - w0)/n; double a; a = f(w0); a += f(w0 + delta * n); int i; for(i=1; i<n; i+=2){ a += 4.0 * f(w0 + delta * i); } for(i=2; i<n; i+=2){ a += 2.0 * f(w0 + delta * i); } return a*delta/3.0; } }; printf("%f\n",_::simpson(w0,w_max)); ... 処理系によってはラムダ式を使うという手もあります。
- nakfactory
- ベストアンサー率57% (11/19)
計算の都合というのがよくわかりませんが、次のようにしてはダメなのでしょうか。 ---------------------------------------- 【main関数の外(main定義より上)にf関数のパラメータを変更して移動】 /* 積分する関数 f(w) */ double f(double w, double j0Ret){ return 2*pi*w*j0Ret; } int main(void) { ---------------------------------------- 【main内f関数コール部を次のように変更】 a = f(w0, j0(Kmm*w0)); a += f(w0 + delta * n, j0(Kmm*(w0 + delta * n))); a += 4.0 * f(w0 + delta * i, j0(Kmm*(w0 + delta * i))); a += 2.0 * f(w0 + delta * i, j0(Kmm*(w0 + delta * i))); ----------------------------------------
お礼
ありがとうございます!計算の都合とは,今後さらに式を発展させ,Kmmをmain内部で計算させないと行けない状態ですので,非常に参考になります!
お礼
ありがとうございます!こちらの方法で試してみます!