FDTD法で遠方界を計算するプログラムの実行結果が表示されない問題

このQ&Aのポイント
  • FDTD法で遠方界を計算するプログラムを作成しましたが、実行結果が正しく表示されません。
  • 大きな値を与えるとbus errorが発生する問題もあります。
  • 遠方界のプログラムに詳しい方にアドバイスをお願いします。
回答を見る
  • ベストアンサー

FDTD 遠方界のプログラム

FDTD法で遠方界を計算するプログラムを作ったのですがコンパイルはうまくいっても実行結果がちゃんと表示されません。プログラムに問題があるのか、大きな値を与えるとbus errorになってしまいます。どなたか遠方界のプリグラムに詳しい方がいらっしゃったら教えて下さい。よろしくお願いします。 プログラム内容 ubroutine far_field implicit none call far_field_yz_plane call far_field_zx_plane call far_field_xy_plane return end subroutine !=================================================================================== ! y-z 平面に対して !=================================================================================== subroutine far_field_yz_plane use consts use fdtd implicit none integer :: i, j, k,ie real(8) :: plane_yz, fac_yz plane_yz = dy*dz fac_yz = plane_yz/(4.0d0*pi*c*dt) ie = nx-6 i = ie+1 do j = 5, ny-5 do k = 5, nz-5 x = (i-0.5d0-ic)*dx y = (j-jc)*dy z = (k-kc)*dz eys = 0.5d0*(ey(i,j,k)+ey(i,j,k+1)) ezs = 0.5d0*(ez(i,j,k)+ez(i,j+1,k)) hys = 0.25d0*(hy(i,j,k)+hy(i,j+1,k)+hy(i-1,j,k)+hy(i-1,j+1,k)) hzs = 0.25d0*(hz(i,j,k)+hz(i,j,k+1)+hz(i-1,j,k)+hz(i-1,j,k+1)) do l = 1, nang time_e = time-dt time_h = time-dt/2.0d0 timesh = -(dirs(l,1)*x+dirs(l,2)*y+dirs(l,3)*z)/c+rf/c tc_e = time_e+timesh tc_h = time_h+timesh m_e = int(tc_e/dt+0.5d0) m_h = int(tc_h/dt+0.5d0) a_e = (0.5d0+tc_e/dt-m_e)*fac_yz b_e = (0.5d0-tc_e/dt+m_e)*fac_yz ab_e = a_e-b_e a_h = (0.5d0+tc_h/dt-m_h)*fac_yz b_h = (0.5d0-tc_h/dt+m_h)*fac_yz ab_h = a_h-b_h wy(l,m_h-1) = wy(l,m_h-1)-hzs*b_h wz(l,m_h-1) = wz(l,m_h-1)+hys*b_h uy(l,m_e-1) = uy(l,m_e-1)+ezs*b_e uz(l,m_e-1) = uz(l,m_e-1)-eys*b_e wy(l,m_h) = wy(l,m_h)-hzs*ab_h wz(l,m_h) = wz(l,m_h)+hys*ab_h uy(l,m_e) = uy(l,m_e)+ezs*ab_e uz(l,m_e) = uz(l,m_e)-eys*ab_e wy(l,m_h+1) = wy(l,m_h+1)+hzs*a_h wz(l,m_h+1) = wz(l,m_h+1)-hys*a_h uy(l,m_e+1) = uy(l,m_e+1)-ezs*a_e uz(l,m_e+1) = uz(l,m_e+1)+eys*a_e enddo enddo enddo ie = 5 i = ie do j = 5, ny-5 do k = 5, nz-5 x = (i-0.5d0-ic)*dx y = (j-jc)*dy z = (k-kc)*dz eys = 0.5d0*(ey(i,j,k)+ey(i,j,k+1)) ezs = 0.5d0*(ez(i,j,k)+ez(i,j+1,k)) hys = 0.25d0*(hy(i,j,k)+hy(i,j+1,k)+hy(i-1,j,k)+hy(i-1,j+1,k)) hzs = 0.25d0*(hz(i,j,k)+hz(i,j,k+1)+hz(i-1,j,k)+hz(i-1,j,k+1)) do l = 1, nang time_e = time-dt time_h = time-dt/2.0d0 timesh = -(dirs(l,1)*x+dirs(l,2)*y+dirs(l,3)*z)/c+rf/c tc_e = time_e+timesh tc_h = time_h+timesh m_e = int(tc_e/dt+0.5d0) m_h = int(tc_h/dt+0.5d0) a_e = (0.5d0+tc_e/dt-m_e)*fac_yz b_e = (0.5d0-tc_e/dt+m_e)*fac_yz ab_e = a_e-b_e a_h = (0.5d0+tc_h/dt-m_h)*fac_yz b_h = (0.5d0-tc_h/dt+m_h)*fac_yz ab_h =a_h-b_h wy(l,m_h-1) = wy(l,m_h-1)-hzs*b_h wz(l,m_h-1) = wz(l,m_h-1)+hys*b_h uy(l,m_e-1) = uy(l,m_e-1)+ezs*b_e uz(l,m_e-1) = uz(l,m_e-1)-eys*b_e wy(l,m_h) = wy(l,m_h)-hzs*ab_h wz(l,m_h) = wz(l,m_h)+hys*ab_h uy(l,m_e) = uy(l,m_e)+ezs*ab_e uz(l,m_e) = uz(l,m_e)-eys*ab_e wy(l,m_h+1) = wy(l,m_h+1)+hzs*a_h wz(l,m_h+1) = wz(l,m_h+1)-hys*a_h uy(l,m_h+1) = uy(l,m_e+1)-ezs*a_e uz(l,m_e+1) = uz(l,m_e+1)+eys*a_e enddo enddo enddo return end subroutine zx平面、xy平面についても同様に書きました。

質問者が選んだベストアンサー

  • ベストアンサー
  • kuma4578
  • ベストアンサー率100% (1/1)
回答No.3

私は大学でFDTD法による遠方界計算とMie散乱の理論値との整合性を調べる研究をしています。 そのため解析領域内に設置した媒質は球形です (媒質の形状によってdirsに格納する値は違ってくると思います) 私の場合、球形媒質の中心点をIc, Jc, Kcとし、dirsには三次元極座標系の値を格納しています。 具体的には、φを0度固定でθを360度回転(XZ面)とφを90度固定でθを360度回転(YZ面)の値です。 教科書中のrfの表現あってるんですかね? rfにセルサイズをかけるとうまくプログラムが回るのですが・・・

その他の回答 (2)

  • kuma4578
  • ベストアンサー率100% (1/1)
回答No.2

FDTD法を用いて遠方界を計算しているものです (結果は出力できていますがうまくいってるのかは正直微妙です) これは散乱体を囲む閉局面の、y-z 平面の上部と下部を計算しているプログラムですよね? 疑問1 上部と下部ではベクトルが反対方向なので計算方法が同じでいいのでしょうか? 自分は上部と下部では+ーを逆にした計算を行っています(宇野さんの教科書にはこの点を詳しく書かれていませんよね) 疑問2 遠方界計算の範囲に吸収境界が含まれていませんか?5~max-5までとなると,例えばPMLを用いている場合4層ということでしょうか? 疑問3 dirs,rfにはどのような値を格納していますか?

528612
質問者

補足

ご回答ありがとうございます。 疑問1に関して、確かに上下でベクトルの符号が変わるので、上部と下部では符号が逆転しますね。訂正しました。 疑問2に関してですが、私は吸収境界条件はMurの2次を用いています。PMLは未だ勉強不足でして。 疑問3に関してですがdirsは全く値を格納していませんでした。しかし、どのような値を入れてよいかわかりません。rfには閉曲面(立方体)の対角線の1/2の値(sqrt((nx-10)^2+(ny-10)^2+(nz-10)^2)/2を格納しています。 もう一つ質問なのですが、Ic, Jc, Kcにはどのような値を格納していますか?dirsと同様によいアドバイスがあればお願いします。 よろしくお願いします。

  • f272
  • ベストアンサー率46% (8012/17124)
回答No.1

> プログラムに問題があるのか と思っているのなら,そのエラーになるプログラムをすべて見せないと分かりません。 use consts use fdtd とあるのに,これらのモジュールはどうなっているのでしょう? またsubroutine far_field_yz_planeの中身を長々と書いていますが,例えばこれを(計算結果がおかしくなるとしても)適当に短くして,同じエラーを起こす最低の長さのプログラムに書きなおすことができるでしょう。そのようにして,回答者が同じエラーを起こすことのできる完全なプログラムを提示してください。

528612
質問者

お礼

すみません。プログラムを載せようとしたら字数制限があり全部入りきりませんでした。また、自分でプログラムをよく見なしてみます。ありがとうございました。

528612
質問者

補足

f272さんのおっしゃる通りモジュールの部分も提示しなければわからないですよね。大変失礼いたしました。 module consts real(8), parameter :: pi = 3.141592653589793d0 !円周率 real(8), parameter :: c = 2.998d8 !光速 c [m/sec] real(8), parameter :: epsilon0 = 8.854d-12 !真空の誘電率 [F/m] real(8), parameter :: mu0 = 4.0d-7*pi !真空の透磁率 [H/m] real(8), parameter :: z0 = 120.0d0*pi !波動インピーダンス [Ω] end module module fdtd ! ********** 遠方界 ********* integer, parameter :: nang = 180 integer :: l real(8) :: dirs(500,3) integer :: m_e, m_h integer :: ic, jc, kc real(8), parameter :: rf = 6075d0 real(8) :: x, y, z real(8) :: exs, eys, ezs real(8) :: hxs, hys, hzs real(8) :: time_e, time_h, timesh real(8) :: tc_e, tc_h real(8) :: a_e, b_e, ab_e, a_h, b_h, ab_h real(8) :: wx(500,500), wy(500,500), wz(500,500) real(8) :: ux(500,500), uy(500,500), uz(500,500) end module subroutine far_field implicit none call far_field_yz_plane call far_field_zx_plane call far_field_xy_plane return end subroutine !=================================================================================== ! y-z 平面に対して !=================================================================================== subroutine far_field_yz_plane use consts use fdtd implicit none integer :: i, j, k, ie real(8) :: plane_yz, fac_yz plane_yz = dy*dz fac_yz = plane_yz/(4.0d0*pi*c*dt) ie = nx-6 i = ie+1 do j = 5, ny-5 do k = 5, nz-5 x = (i-0.5d0-ic)*dx y = (j-jc)*dy z = (k-kc)*dz eys = 0.5d0*(ey(i,j,k)+ey(i,j,k+1)) ezs = 0.5d0*(ez(i,j,k)+ez(i,j+1,k)) hys = 0.25d0*(hy(i,j,k)+hy(i,j+1,k)+hy(i-1,j,k)+hy(i-1,j+1,k)) hzs = 0.25d0*(hz(i,j,k)+hz(i,j,k+1)+hz(i-1,j,k)+hz(i-1,j,k+1)) do l = 1, nang time_e = time-dt time_h = time-dt/2.0d0 timesh = -(dirs(l,1)*x+dirs(l,2)*y+dirs(l,3)*z)/c+rf/c tc_e = time_e+timesh tc_h = time_h+timesh m_e = int(tc_e/dt+0.5d0) m_h = int(tc_h/dt+0.5d0) a_e = (0.5d0+tc_e/dt-m_e)*fac_yz b_e = (0.5d0-tc_e/dt+m_e)*fac_yz ab_e = a_e-b_e a_h = (0.5d0+tc_h/dt-m_h)*fac_yz b_h = (0.5d0-tc_h/dt+m_h)*fac_yz ab_h = a_h-b_h wy(l,m_h-1) = wy(l,m_h-1)-hzs*b_h wz(l,m_h-1) = wz(l,m_h-1)+hys*b_h uy(l,m_e-1) = uy(l,m_e-1)+ezs*b_e uz(l,m_e-1) = uz(l,m_e-1)-eys*b_e wy(l,m_h) = wy(l,m_h)-hzs*ab_h wz(l,m_h) = wz(l,m_h)+hys*ab_h uy(l,m_e) = uy(l,m_e)+ezs*ab_e uz(l,m_e) = uz(l,m_e)-eys*ab_e wy(l,m_h+1) = wy(l,m_h+1)+hzs*a_h wz(l,m_h+1) = wz(l,m_h+1)-hys*a_h uy(l,m_e+1) = uy(l,m_e+1)-ezs*a_e uz(l,m_e+1) = uz(l,m_e+1)+eys*a_e enddo enddo enddo

関連するQ&A

  • fortran FFT

    FDTD法を用いた計算の中で遠方界を計算するのにフーリエ変換が必要になり以下のプログラムを作ったのですがコンパイルの際に以下のエラーが出てしまいます。文字の定義もいろいろと変えてやってはいるのですが、なかなかうまくいきません。どなたかわかる方がいらっしゃったら教えて下さい。よろしくお願いします。 plane_yz = dy*dz fac_yz = plane_yz/(4.0d0*pi*c*dt) ie = nx-6 i = ie+1 do j = 5, ny-5 do k = 5, nz-5 x = (i-0.5d0-ic)*dx y = (j-jc)*dy z = (k-kc)*dz eys = 0.5d0*(ey(i,j,k)+ey(i,j,k+1)) ezs = 0.5d0*(ez(i,j,k)+ez(i,j+1,k)) hys = 0.25d0*(hy(i,j,k)+hy(i,j+1,k)+hy(i-1,j,k)+hy(i-1,j+1,k)) hzs = 0.25d0*(hz(i,j,k)+hz(i,j,k+1)+hz(i-1,j,k)+hz(i-1,j,k+1)) do l = 1, nang time_e = time-dt time_h = time-dt/2.0d0 timesh = -(dirs(l,1)*x+dirs(l,2)*y+dirs(l,3)*z)/c+rf/c tc_e = time_e+timesh tc_h = time_h+timesh m_e = int(tc_e/dt+0.5d0) m_h = int(tc_h/dt+0.5d0) a_e = (0.5d0+tc_e/dt-m_e)*fac b_e = (0.5d0-tc_e/dt+m_e)*fac ab_e = a_e-b_e a_h = (0.5d0+tc_h/dt-m_h)*fac b_h = (0.5d0-tc_h/dt+m_h)*fac ab_h = a_h-b_h wy(l,m_h-1) = wy(l,m_h-1)-hzs*b_h wz(l,m_h-1) = wz(l,m_h-1)+hys*b_h uy(l,m_e-1) = uy(l,m_e-1)+ezs*b_e uz(l,m_e-1) = uz(l,m_e-1)-eys*b_e wy(l,m_h) = wy(l,m_h)-hzs*ab_h wz(l,m_h) = wz(l,m_h)+hys*ab_h uy(l,m_e) = uy(l,m_e)+ezs*ab_e uz(l,m_e) = uz(l,m_e)-eys*ab_e wy(l,m_h+1) = wy(l,m_h+1)+hzs*a_h wz(l,m_h+1) = wz(l,m_h+1)-hys*a_h uy(l,m_e+1) = uy(l,m_e+1)-ezs*a_e uz(l,m_e+1) = uz(l,m_e+1)+eys*a_e enddo enddo enddo コンパイル後timesh = -(dirs(l,1)*x+dirs(l,2)*y+dirs(l,3)*z)/c+rf/c 1 Error: Unexpected array reference at (1) In file far_field.f90:48 wy(l,m_h-1) = wy(l,m_h-1)-hzs*b_h 1 Error: Unexpected array reference at (1) In file far_field.f90:49 wz(l,m_h-1) = wz(l,m_h-1)+hys*b_h 1 Error: Unexpected array reference at (1) In file far_field.f90:50 uy(l,m_e-1) = uy(l,m_e-1)+ezs*b_e 1 Error: Unexpected array reference at (1) In file far_field.f90:51 と続きます。

  • このプログラムの実行結果についてお助け下さい2

    2、続きです。 ちなみに以前に同じ質問を投稿し、回答を頂いてそこを直すと正しく実行できたと勘違いして質問を終わらせてしまいました・・・。 //U2のとき for(L=-A;L<=A;L++) { for(M=-B;M<=B;M++) { for(N=-C;N<=C;N++) { x=(2*L+1)*a*cos(Beta)/2; y=M*b+b/2; z=N*c-((2*L+1)*a*sin(Beta))/2; X=x-Px2; Y=y-Py2; Z=z-Pz2; r=sqrt((X*X)+(Y*Y)+(Z*Z)); if(r<R){ if(L==0&&M==0&&N==0){ Hdx15=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy15=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz15=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); } else if(L==-1&&M==0&&N==0){ Hdx16=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy16=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz16=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); } else if(L==0&&M==0&&N==1){ Hdx17=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy17=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz17=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); } else if(L==-1&&M==0&&N==1){ Hdx18=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy18=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz18=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); } else if(L=-1&&M==0&&N==-1){ Hdx19=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy19=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz19=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); } else{ Hdx=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); THDX22=THDX22+Hdx; THDY22=THDY22+Hdy; THDZ22=THDZ22+Hdz; printf("L=%d M=%d N=%d R=%lf\n",L,M,N,r); } } } } } Hdx20=Hdx15+Hdx16+Hdx17+Hdx18+Hdx19; Hdy20=Hdy15+Hdy16+Hdy17+Hdy18+Hdy19; Hdz20=Hdz15+Hdz16+Hdz17+Hdz18+Hdz19; printf("ここまでがlowerのU2の時のL,M,N、それぞれの値\n"); printf("THDX11は%eです。\n",THDX11); printf("THDY11は%eです。\n",THDY11); printf("THDZ11は%eです。\n",THDZ11); printf("THDX12は%eです。\n",THDX12); printf("THDY12は%eです。\n",THDY12); printf("THDZ12は%eです。\n",THDZ12); printf("THDX21は%eです。\n",THDX21); printf("THDY21は%eです。\n",THDY21); printf("THDZ21は%eです。\n",THDZ21); printf("THDX22は%eです。\n",THDX22); printf("THDY22は%eです。\n",THDY22); printf("THDZ22は%eです。\n",THDZ22); printf("\n"); Hdx21=THDX11+THDX12; Hdy21=THDY11+THDY12; Hdz21=THDZ11+THDZ12; Hdx22=THDX21+THDX22; Hdy22=THDY21+THDY22; Hdz22=THDZ21+THDZ22; printf("Hdx21は%eです。\n",Hdx21); printf("Hdy21は%eです。\n",Hdy21); printf("Hdz21は%eです。\n",Hdz21); printf("Hdx22は%eです。\n",Hdx22); printf("Hdy22は%eです。\n",Hdy22); printf("Hdz22は%eです。\n",Hdz22); Hdip1=sqrt((Hdx21*Hdx21)+(Hdy21*Hdy21)+(Hdz21*Hdz21)); Hdip2=sqrt((Hdx22*Hdx22)+(Hdy22*Hdy22)+(Hdz22*Hdz22)); printf("Hdip1は%eです。\n",Hdip1); printf("Hdip2は%eです。\n",Hdip2); upper=Hdip1*gamma; lower=Hdip2*gamma; printf("upperは%eです。\n",upper); printf("lowerは%eです。\n",lower); upper=0; lower=0; Hdip3=sqrt((Hdx4*Hdx4)+(Hdy4*Hdy4)+(Hdz4*Hdz4)+(Hdx10*Hdx10)+(Hdy10*Hdy10)+(Hdz10*Hdz10)); Hdip4=sqrt((Hdx14*Hdx14)+(Hdy14*Hdy14)+(Hdz14*Hdz14)+(Hdx20*Hdx20)+(Hdy20*Hdy20)+(Hdz20*Hdz20)); printf("抜き出した8個の原子の総合の磁場は、upperの方のHdip3は、%lf、\nlowerの方のHdip4は%lfです。\n",Hdip3,Hdip4); printf("これらを、また元の結晶に戻した時、\n"); upper=0;lower=0; Hdip5=sqrt((Hdx21*Hdx21)+(Hdy21*Hdy21)+(Hdz21*Hdz21)+(Hdx4*Hdx4)+(Hdy4*Hdy4)+(Hdz4*Hdz4)+(Hdx10*Hdx10)+(Hdy10*Hdy10)+(Hdz10*Hdz10)); Hdip6=sqrt((Hdx22*Hdx22)+(Hdy22*Hdy22)+(Hdz22*Hdz22)+(Hdx14*Hdx14)+(Hdy14*Hdy14)+(Hdz14*Hdz14)+(Hdx20*Hdx20)+(Hdy20*Hdy20)+(Hdz20*Hdz20)); upper=Hdip5*gamma; lower=Hdip6*gamma; printf("upperは%eです。\n",upper); printf("lowerは%eです。\n",lower); 以上です・・・。

  • このプログラムの実行結果についてお助け下さい2

    //U2のとき for(L=-A;L<=A;L++) { for(M=-B;M<=B;M++) { for(N=-C;N<=C;N++) { x=(2*L+1)*a*cos(Beta)/2; y=M*b+b/2; z=N*c-((2*L+1)*a*sin(Beta))/2; X=x-Px2; Y=y-Py2; Z=z-Pz2; r=sqrt((X*X)+(Y*Y)+(Z*Z)); if(r<R){ if(L==0&&M==0&&N==0){ Hdx15=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy15=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz15=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); } else if(L==-1&&M==0&&N==0){ Hdx16=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy16=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz16=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); } else if(L==0&&M==0&&N==1){ Hdx17=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy17=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz17=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); } else if(L==-1&&M==0&&N==1){ Hdx18=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy18=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz18=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); } else if(L=-1&&M==0&&N==-1){ Hdx19=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy19=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz19=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); } else{ Hdx=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); THDX22=THDX22+Hdx; THDY22=THDY22+Hdy; THDZ22=THDZ22+Hdz; printf("L=%d M=%d N=%d R=%lf\n",L,M,N,r); } } } } } Hdx20=Hdx15+Hdx16+Hdx17+Hdx18+Hdx19; Hdy20=Hdy15+Hdy16+Hdy17+Hdy18+Hdy19; Hdz20=Hdz15+Hdz16+Hdz17+Hdz18+Hdz19; printf("ここまでがlowerのU2の時のL,M,N、それぞれの値\n"); printf("THDX11は%eです。\n",THDX11); printf("THDY11は%eです。\n",THDY11); printf("THDZ11は%eです。\n",THDZ11); printf("THDX12は%eです。\n",THDX12); printf("THDY12は%eです。\n",THDY12); printf("THDZ12は%eです。\n",THDZ12); printf("THDX21は%eです。\n",THDX21); printf("THDY21は%eです。\n",THDY21); printf("THDZ21は%eです。\n",THDZ21); printf("THDX22は%eです。\n",THDX22); printf("THDY22は%eです。\n",THDY22); printf("THDZ22は%eです。\n",THDZ22); printf("\n"); Hdx21=THDX11+THDX12; Hdy21=THDY11+THDY12; Hdz21=THDZ11+THDZ12; Hdx22=THDX21+THDX22; Hdy22=THDY21+THDY22; Hdz22=THDZ21+THDZ22; printf("Hdx21は%eです。\n",Hdx21); printf("Hdy21は%eです。\n",Hdy21); printf("Hdz21は%eです。\n",Hdz21); printf("Hdx22は%eです。\n",Hdx22); printf("Hdy22は%eです。\n",Hdy22); printf("Hdz22は%eです。\n",Hdz22); Hdip1=sqrt((Hdx21*Hdx21)+(Hdy21*Hdy21)+(Hdz21*Hdz21)); Hdip2=sqrt((Hdx22*Hdx22)+(Hdy22*Hdy22)+(Hdz22*Hdz22)); printf("Hdip1は%eです。\n",Hdip1); printf("Hdip2は%eです。\n",Hdip2); upper=Hdip1*gamma; lower=Hdip2*gamma; printf("upperは%eです。\n",upper); printf("lowerは%eです。\n",lower); upper=0; lower=0; Hdip3=sqrt((Hdx4*Hdx4)+(Hdy4*Hdy4)+(Hdz4*Hdz4)+(Hdx10*Hdx10)+(Hdy10*Hdy10)+(Hdz10*Hdz10)); Hdip4=sqrt((Hdx14*Hdx14)+(Hdy14*Hdy14)+(Hdz14*Hdz14)+(Hdx20*Hdx20)+(Hdy20*Hdy20)+(Hdz20*Hdz20)); printf("抜き出した8個の原子の総合の磁場は、upperの方のHdip3は、%lf、\nlowerの方のHdip4は%lfです。\n",Hdip3,Hdip4); printf("これらを、また元の結晶に戻した時、\n"); upper=0;lower=0; Hdip5=sqrt((Hdx21*Hdx21)+(Hdy21*Hdy21)+(Hdz21*Hdz21)+(Hdx4*Hdx4)+(Hdy4*Hdy4)+(Hdz4*Hdz4)+(Hdx10*Hdx10)+(Hdy10*Hdy10)+(Hdz10*Hdz10)); Hdip6=sqrt((Hdx22*Hdx22)+(Hdy22*Hdy22)+(Hdz22*Hdz22)+(Hdx14*Hdx14)+(Hdy14*Hdy14)+(Hdz14*Hdz14)+(Hdx20*Hdx20)+(Hdy20*Hdy20)+(Hdz20*Hdz20)); upper=Hdip5*gamma; lower=Hdip6*gamma; printf("upperは%eです。\n",upper); printf("lowerは%eです。\n",lower); 以上です・・・。

  • お判りになる方、是非ともお助け下さい(Excel)

    Excel関数で、以下の関数を使用したいのですが、どうしてもうまくいきません。どうすればよいでしょうか =IF(M5="",L5,IF(AND(M5="",L5=""),K5,IF(AND(M5="",L5="",K5=""),J5,IF(AND(M5="",L5="",K5="",J5=""),I5,IF(AND(M5="",L5="",K5="",J5="",I5=""),H5,IF(AND(M5="",L5="",K5="",J5="",I5="",H5=""),G5,IF(AND(M5="",L5="",K5="",J5="",I5="",H5="",G5=""),F5,IF(AND(M5="",L5="",K5="",J5="",I5="",H5="",G5="",F5=""),E5,IF(AND(M5="",L5="",K5="",J5="",I5="",H5="",G5="",F5="",E5=""),D5,IF(AND(M5="",L5="",K5="",J5="",I5="",H5="",G5="",F5="",E5="",D5=""),C5,IF(AND(M5="",L5="",K5="",J5="",I5="",H5="",G5="",F5="",E5="",D5="",C5=""),B5,IF(B5="",B5,M5)))))))))))) 左から右に4月から3月までの行方向の表があり、入力されたら数値を反映させたいのですが、3月と2月は問題ないものの1月からは反映されません

  • 振り子の問題です!

    振り子の問題です! 振り子の運動方程式を、振り子に固定した動座標系O-i,j,kを用いて導く。 (以下、ベクトル表示のものは、横に→をつけるものとする。例:aベクトルは、a→) 時間t、振り子の質量m1,m2、原点Oからの距離r1,r2、 2質点の位置ベクトルをr1→(t)=-r1・i→(t)、r2→(t)=r2・j→(t)、 振り子の回転角速度をw→=wk→、ただしw=dθ/dt、重力加速度をg→とする。 一般に角速度w→=wx・i→+wy・j→+wz・k→で回転する動座標系の基底の時間変化は、 [ (di→/dt)=w→×i→、(dj→/dt)=w→×j→、(dk→/dt)=w→×k→、ただし、×は外積 ] であらわされる。 これを図の2質点振り子に適用すると、w→=wk→(wx=wy=0、wz=w) 問題:(di→/dt)=( ?? )j→    (dj→/dt)=( ?? )i→ i→の微分がj→を含んだ式であらわされるという点がわかりません。 そしてkの存在の意味がよくわかりません。ちなみにこのあとにも問題は続いています。 この問題だけでいいです。教えてください。

  • このプログラムのエラーの原因を教えて下さいNo.1

    まずはじめに申しますが大変手間をとる回答になるのでそれでも協力してくれる方がいればの質問です・・・。 このプログラムを実行すると、Hdx3no2が宣言なしで使われているとエラーが出るのですが理由がわかりません。どこがおかしいのか教えてもらえると助かります。あまりにも長いので(コンパクトにできていないので)3回の質問に分けてしまいます・・・。そして非常に見にくくて済みません。 #include<stdio.h> #include<math.h> int main(void) { int L,M,N,A,B,C; double U1,U2,x,y,z,X,Y,Z,r,ux1,uy1,uz1,ux2,uy2,uz2,Hdx,Hdy,Hdz; double Hdx1,Hdy1,Hdz1,Hdx2,Hdy2,Hdz2,Hdip1,Hdip2,uB,fai,sita,RAD,a,b,c; double Hdx3,Hdy3,Hdz3,Hdx3no1,Hdy3no1,Hdz3no1,Hdx3no2,Hdy3no2,Hdz3no2; double Hdx4,Hdy4,Hdz4,Hdx4no1,Hdy4no1,Hdz4no1,Hdx4no2,Hdy4no2,Hdz4no2; double Px1,Py1,Pz1,Px2,Py2,Pz2,THDX11,THDY11,THDZ11; double THDX12,THDY12,THDZ12,THDX21,THDY21,THDZ21; double THDX22,THDY22,THDZ22,R,gamma,Beta,CPA,CPB,CPC,upper,lower; uB=9.274; U1=3.41*uB; U2=-U1; RAD=3.14159265358979/180; a=7.256; b=8.575; c=3.544; Beta=7.55*RAD; CPA=0.0604; CPB=0.3; CPC=0.156; //プロトンの位置 Px1=CPA*a*cos(Beta); Py1=CPB*b; Pz1=CPC*c-CPA*a*sin(Beta); Px2=-Px1; Py2=Py1; Pz2=-Pz1; sita=90*RAD; fai=90*RAD; THDX11=0; THDY11=0; THDZ11=0; THDX12=0; THDY12=0; THDZ12=0; THDX21=0; THDY21=0; THDZ21=0; THDX22=0; THDY22=0; THDZ22=0; R=6; gamma=4.25775; A=(R/a)+1; B=(R/b)+1; C=(R/c)+1; ux1=U1*sin(sita)*cos(fai); uy1=U1*sin(sita)*sin(fai); uz1=U1*cos(sita); ux2=U2*sin(sita)*cos(fai); uy2=U2*sin(sita)*sin(fai); uz2=U2*cos(sita); //upper //U1のとき for(L=-A;L<=A;L++) { for(M=-B;M<=B;M++) { for(N=-C;N<=C;N++) { x=L*a*cos(Beta); y=M*b; z=N*c-L*a*sin(Beta); X=x-Px1; Y=y-Py1; Z=z-Pz1; r=sqrt((X*X)+(Y*Y)+(Z*Z)); if(r<R&&L!=0&&M!=0&&N!=-1||L!=0&&M!=0&&N!=0||L!=0&&M!=0&&N!=1){ Hdx=((-ux1/pow(r,3))+3*X*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); Hdy=((-uy1/pow(r,3))+3*Y*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); Hdz=((-uz1/pow(r,3))+3*Z*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); THDX11=THDX11+Hdx; THDY11=THDY11+Hdy; THDZ11=THDZ11+Hdz; printf("L=%d M=%d N=%d R=%lf\nAAA\n",L,M,N,r); } else if(L==0&&M==0&&N==-1||L==0&&M==0&&N==0||L==0&&M==0&&N==1){ Hdx3no1=((-ux1/pow(r,3))+3*X*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); Hdy3no1=((-uy1/pow(r,3))+3*Y*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); Hdz3no1=((-uz1/pow(r,3))+3*Z*(ux1*X+uy1*Y+uz1*Z)/pow(r,5)); } else{ continue; } } } } //U2のとき for(L=-A;L<=A;L++) { for(M=-B;M<=B;M++) { for(N=-C;N<=C;N++) { x=(2*L+1)*a*cos(Beta)/2; y=M*b+b/2; z=N*c-((2*L+1)*a*sin(Beta))/2; X=x-Px1; Y=y-Py1; Z=z-Pz1; r=sqrt((X*X)+(Y*Y)+(Z*Z)); if(r<R&&L!=-1&&M!=0&&N!=-1||L!=-1&&M!=0&&N!=0||L!=-1&&M!=0&&N!=1){ if(L!=0&&M!=0&&N!=-1||L!=0&&M!=0&&N!=0||L!=0&&M!=0&&N!=1){ Hdx=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2+Z)/pow(r,5)); Hdy=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2+Z)/pow(r,5)); Hdz=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2+Z)/pow(r,5)); THDX12=THDX12+Hdx; THDY12=THDY12+Hdy; THDZ12=THDZ12+Hdz; printf("L=%d M=%d N=%d R=%lf\nBBB\n",L,M,N,r); } } else if(L==-1&&M==0&&N==-1||L==-1&&M==0&&N==0||L==-1&&M==0&&N==1){ if(L==0&&M==0&&N==-1||L==0&&M==0&&N==0||L==0&&M==0&&N==1){ Hdx3no2=((-ux2/pow(r,3))+3*X*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdy3no2=((-uy2/pow(r,3))+3*Y*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); Hdz3no2=((-uz2/pow(r,3))+3*Z*(ux2*X+uy2*Y+uz2*Z)/pow(r,5)); } } else{ continue; } } } } これをNo.1として続きのプログラムをNo.2に挙げます。

  • 方向微分係数の説明が理解できません

     48歳の会社員です。裳華房の「基礎解析学コース ベクトル解析」を使って ベクトル解析を勉強しているのですが、22頁にある方向微分係数の説明がどう しても理解できません。  理解できない部分の画像を添付しましたが、(1)の式が(2)の式になる過程と (2)の式の [ ]t=0 (鍵括弧と鍵括弧の外にある「t=0」)の意味が分かりません。  (2)の [ ] (鍵括弧)の中の式は d/dt φ(x + t * ux, y + t * uy, z + t * uz) = lim h→0 (φ(x + (t + h) * ux, y + (t + h) * uy, z + (t + h) * uz) - φ(x + t * ux, y + t * uy, z + t * uz)) / h と考えたのですが、下の(1)の式にすることができません。 dφ/du = lim t→0 (φ(x + t * ux, y + t * uy, z + t * uz) - φ(x, y, z)) / t  (1)の式を(2)の式にすることができれば、 X = x + t * ux, Y = y + t * uy, Z = z + t * uz として、 φ(x + t * ux, y + t * uy, z + t * uz) を φ(X, Y, Z) に置き換え、 dφ/du = ∂φ/∂X * dX/dt + ∂φ/∂Y * dY/dt + ∂φ/∂Z * dZ/dt = ∂φ/∂X * ux + ∂φ/∂Y * uy + ∂φ/∂Z * uz = ∂φ/∂x * ux + ∂φ/∂y * uy + ∂φ/∂z * uz と(3)の式にすると理解しているのですが、この流れで合っているでしょうか ?  独学で勉強しており周りに聞ける人がいないため、ご教示いただければ幸いです。

  • プログラムの間違いを教えてください。

    VBAのFFTのプログラムをCで書き直しています。 C言語ではうまく動作しません。間違いを教えていただけないでしょうか? よろしくお願いします。 (1)動くVBAのプログラム(参照 http://tsuyu.cocolog-nifty.com/blog/2007/03/publi.html) Option Explicit Public Sub fft() Dim g, h, i, j, k, l, m, n, o, p, q As Integer i = 0 j = 0 k = 0 l = 0 p = 0 h = 0 g = 0 q = 0 'データ数nを指定(2の整数乗である必要あり) n = 1024 m = Log(n) / Log(2) 'xr,xiはデータ数以上、s,cはデータ数の半分以上を指定しておく Dim xr(1024), xi(1024), xd, s(512), c(512), a, b As Single 'データの読み込み 1列目を実数部、2列目を虚数部とする For i = 1 To n xr(i - 1) = Cells(i, 1) xi(i - 1) = Cells(i, 2) Next i 'FFTの計算 a = 0 b = 3.14159265359 * 2 / n For i = 0 To n / 2 s(i) = Sin(a) c(i) = Cos(a) a = a + b Next i l = n h = 1 For g = 1 To m l = l / 2 k = 0 For q = 1 To h p = 0 For i = k To l + k - 1 j = i + l a = xr(i) - xr(j) b = xi(i) - xi(j) xr(i) = xr(i) + xr(j) xi(i) = xi(i) + xi(j) If p = 0 Then xr(j) = a: xi(j) = b Else xr(j) = a * c(p) + b * s(p) xi(j) = b * c(p) - a * s(p) End If p = p + h Next i k = k + l + l Next q h = h + h Next g j = n / 2 For i = 1 To n - 1 k = n If j < i Then xd = xr(i) xr(i) = xr(j) xr(j) = xd xd = xi(i) xi(i) = xi(j) xi(j) = xd End If k = k / 2 Do While j >= k j = j - k k = k / 2 Loop j = j + k Next i 'データの出力 For i = 1 To n '4列目に実数部、5列目に虚数部、6列目に絶対値を表示 Cells(i, 4) = xr(i - 1) Cells(i, 5) = xi(i - 1) Cells(i, 6) = (xr(i - 1) ^ 2 + xi(i - 1) ^ 2) ^ 0.5 Next i End Sub (2)上記のプログラムの書き換えている箇所 For i = 1 To n xr(i - 1) = Cells(i, 1) xi(i - 1) = Cells(i, 2) Next i 'FFTの計算 a = 0 b = 3.14159265359 * 2 / n For i = 0 To n / 2 s(i) = Sin(a) c(i) = Cos(a) a = a + b Next i l = n h = 1 For g = 1 To m l = l / 2 k = 0 For q = 1 To h p = 0 For i = k To l + k - 1 j = i + l a = xr(i) - xr(j) b = xi(i) - xi(j) xr(i) = xr(i) + xr(j) xi(i) = xi(i) + xi(j) If p = 0 Then xr(j) = a: xi(j) = b Else xr(j) = a * c(p) + b * s(p) xi(j) = b * c(p) - a * s(p) End If p = p + h Next i k = k + l + l Next q h = h + h Next g j = n / 2 For i = 1 To n - 1 k = n If j < i Then xd = xr(i) xr(i) = xr(j) xr(j) = xd xd = xi(i) xi(i) = xi(j) xi(j) = xd End If k = k / 2 Do While j >= k j = j - k k = k / 2 Loop j = j + k Next i (3)書き換えたけど変な値が発生するプログラム #include <stdio.h> #include <conio.h> #include <string.h> #include <stdlib.h> #include <math.h> FILE *fp; FILE *fa; char a[100]; double b[1200]; double c[1200]; double d[1200]; double e[1200]; double f[1200]; char str[100]; char *p; double h; long i; long j; long k; long l; int m; long n; long o; int q; double x[25]; long s; double t; double u[1200]; double v[20][1200]; double v2[20][1200]; double v3[20][1200]; double w[25]; double intercept[10]; double slope[10]; double frequency[12]; double dtime; double dtime2; double theta1; double theta2; double co[1200]; double si[1200]; double xd; long l2; long l3; long n3; long h3; long g3; long m3; long k3; long p3; long q3; long i3; long j3; long x3; double y3; double a3; double b3; double c3; double d3; double f3; double w2[25]; x3=0; y3=0; i3=0; j3=0; k3=0; l3=0; p3=0; h3=0; g3=0; q3=0; a3=0; b3=0; c3=0; d3=0; theta1=0; theta2=3.14159265359*2/1024; for(l=0; l<=512; l++){ si[l]=sin(theta1); co[l]=cos(theta1); theta1=theta1+theta2; } n3=1024; m3=10; l3=n3; h3=1; for(g3=1; g3<=m3; g3++){ l3=l3/2; k3=0; for(q3=1; q3<=h3; q3++){ p3=0; for(i3=k3; i3<(l3+k3); i3++){ j3=i3+1; theta1=c[i3]-c[j3]; theta2=d[i3]-d[j3]; if(p3==0){ c[j3]=theta1; d[j3]=theta2; } else{ c[j3]=theta1*co[p3]+theta2*si[p3]; d[j3]=theta2*co[p3]-theta1*si[p3]; } p3=p3+h3; } k3=k3+l3+l3; } h3=h3+h3; } j3=n3/2; for(i3=1; i3<n; i3++){ k3=n3; if(j3<i3){ xd=c[i3]; c[i3]=c[j3]; c[j3]=xd; xd=d[i3]; d[i3]=d[j3]; d[j3]=xd; } k3=k3/2; while(j3>=k3){ j3=j3-k3; k3=k3/2; } j3=j3+k3; } for(i3=0; i3<n3; i3++){ c[i3]=c[i3]/1024; d[i3]=d[i3]/1024; } (1)中の(2)箇所を(3)のように書き換えました。 どうしてもうまく動作しません。 教えていただけないでしょうか? よろしくお願いいたします。

  • C言語の配列の使い方について質問です。

    以下のプログラムを配列を使って見やすくしたいのですが、どのように作ったら良いでしょうか? 宜しくお願いします。 #include<stdio.h> int main(void) { int a, b, c, d, e, f, g, h, i, j, k, l, m ,n, o; /*5段目の処理*/ for(a = 1; a <= 15; a++) { for(b = 1; b <= 15; b++) { if(a == b) continue; for(c = 1; c <= 15; c++) { if(a == c || b == c) continue; for(d = 1; d <= 15; d++) { if(a == d || b == d || c == d) continue; for(e = 1; e <= 15; e++) { if(a == e || b == e || c == e || d == e) continue; // printf("%d %d %d %d %d\n", a, b, c, d, e); ////4段目//// if(a>b){ f=a-b; } else if(a<b){ f=b-a; } if(b>c){ g=b-c; } else if(b<c){ g=c-b; } if(c>d){ h=c-d; } else if(c<d){ h=d-c; } if(d>e){ i=d-e; } else if(e<d){ i=e-d; } // printf(" %d %d %d %d \n", f, g, h, i); /////3段目//// if(f>g){ j=f-g; } else if(f<g){ j=g-f; } if(g>h){ k=g-h; } else if(g<h){ k=h-g; } if(h>i){ l=h-i; } else if(h<i){ l=i-h; } // printf(" %d %d %d \n", j, k, l); /////2段目//// if(j>k){ m=j-k; } else if(j<k){ m=k-j; } if(k>l){ n=k-l; } else if(k<l){ n=l-k; } // printf(" %d %d \n", m, n); /////三段目///// if(m>n){ o=m-n; } else if(m<n){ o=n-m; } // printf(" %d \n", o); if(a != b != c != d != e != f != g != h != i != j != k != l != m != n != o){ printf("%d %d %d %d %d\n", a, b, c, d, e); printf(" %d %d %d %d \n", f, g, h, i); printf(" %d %d %d \n", j, k, l); printf(" %d %d \n", m, n); printf(" %d \n", o); } } } } } } }

  • 数式の解法について

    以下の(1)(2)(3)式の解法を教えて下さい。 おそらく、微分し・積分し、解くのだと思うのですが。。。 (1)式については、 M・dθi=Hdt+C・Q・(θj-θi)dt・・・・・(1) 初期条件としてt=0でθi=θ0として、θiについて解きたいのですが。。。 同様に(2)(3)についても、θiについて解きたいのですが。。。 M・dθi=α・A・(θj-θi)dt+C・Q・(θk-θi)dt・・・・・(2) M・dθi=α・A・(θj-θi)dt+C・Q・(θk-θi)dt+β・A・(θl-θi)dt・・・・・(3) 積分が解けずに困っております。どうか教えて下さい。

専門家に質問してみよう