• 締切済み

FDTD法を用いた電磁界解析にOpenMPを導入

FDTD法を用いた電磁界解析にOpenMPを導入するにはどうしたらよいのでしょうか? ちなみに3次元のプログラムを作成しており、電磁界解析のエンジン部分は下記の様になっています。 for( kt=0; kt<=it ; kt++) { /* ※※※forの括弧開始※※※ */ /*********** 1ステップ前の電磁界[jt-1]の値の定式 ***********/ for( jx=0; jx<=ix; jx++ ) for( jy=0; jy<=iy; jy++ ) for( jz=0; jz<=iz; jz++ ) { exg[jx][jy][jz] = ex[jx][jy][jz]; eyg[jx][jy][jz] = ey[jx][jy][jz]; ezg[jx][jy][jz] = ez[jx][jy][jz]; } /*********** 磁界(hx)の計算 ***********/ for( jx=0; jx<=ix; jx++ ) for( jy=0; jy<=iy-1; jy++ ) for( jz=0; jz<=iz-1; jz++ ) { double dey = (ey[jx][jy][jz+1]-ey[jx][jy][jz])/dz; double dez = (ez[jx][jy+1][jz]-ez[jx][jy][jz])/dy; hx[jx][jy][jz] = hx[jx][jy][jz]+dt/amuy[jx][jy][jz]*(dey-dez); } /*********** 磁界(hy)の計算 ***********/ for( jx=0; jx<=ix-1; jx++ ) for( jy=0; jy<=iy; jy++ ) for( jz=0; jz<=iz-1; jz++ ) { double dez = (ez[jx+1][jy][jz]-ez[jx][jy][jz])/dx; double dex = (ex[jx][jy][jz+1]-ex[jx][jy][jz])/dz; hy[jx][jy][jz] = hy[jx][jy][jz]+dt/amuz[jx][jy][jz]*(dez-dex); } /*********** 磁界(hz)の計算 ***********/ for( jx=0; jx<=ix-1; jx++ ) for( jy=0; jy<=iy-1; jy++ ) for( jz=0; jz<=iz; jz++ ) { double dex = (ex[jx][jy+1][jz]-ex[jx][jy][jz])/dy; double dey = (ey[jx+1][jy][jz]-ey[jx][jy][jz])/dx; hz[jx][jy][jz] = hz[jx][jy][jz]+dt/amuz[jx][jy][jz]*(dex-dey); } /*********** 励振 ***********/ for( jx=1; jx<=ix-1; jx++ ) for( jz=1; jz<=iz-2; jz++ ) { ez[jx][80][jz] = sin( 2.0*pi*(kt%100)/100 )*sin(pi*float(jx)/float(ix)); } /*********** 電界(Ez)の計算 ***********/ for( jx=1; jx<=ix-1; jx++ ) for( jy=1; jy<=iy-1; jy++ ) for( jz=0; jz<=iz-1; jz++ ) { double term1 = (1.0-sigmax[jx][jy][jz]*dt/(2.0*epsirx[jx][jy][jz])) /(1.0+sigmax[jx][jy][jz]*dt/(2.0*epsirx[jx][jy][jz])); double term2 = 1.0/(1.0+sigmax[jx][jy][jz]*dt/(2.0*epsirx[jx][jy][jz])); double dhy = (hy[jx][jy][jz]-hy[jx-1][jy][jz])/dx; double dhx = (hx[jx][jy][jz]-hx[jx][jy-1][jz])/dy; ez[jx][jy][jz] = term1*ez[jx][jy][jz]+dt/epsirx[jx][jy][jz]*term2*(dhy-dhx); } ・ ・ ・ この後電界の計算が同様に続きます。 どなたかこのプログラムにOpenMPを導入するにはどうすればよいか教えていただきたいです。

みんなの回答

  • ki073
  • ベストアンサー率77% (491/634)
回答No.4

>三重の場合はどのようにすればよいのでしょうか? 変数をカンマで区切って並べるだけです #pragma omp parallel for private(lwjy, lwjz) のような感じです

  • ki073
  • ベストアンサー率77% (491/634)
回答No.3

No.1のお礼欄のソースコードですが、 例えば***領域II***の場合、ループの中に ( cos(lwux)*cos((lwuz/lwtz)*(lwkz0-lwjz)*lwdz-lwfhi)/exp((lwwx/lwtx)*((lwkx0-lwjx)*lwdx-lwtx)) )*lwaz; とありますが、 cos(lwux)は二重ループの外に /exp((lwwx/lwtx)*(lwkx0-lwjx)*lwdx-lwtx)*lwaz は1つ外のループに移せますので、それでかなり計算量が減らせます。三角関数やexpはかなり時間がかかるので、結構効果が期待できます。 コンパイラにもよるのですが、gcc(4.4.7)だとループの外に出す最適化はコンパイラでは行われていないようで、書き換え効果はかなり出そうです。 私が普段使っているpgiのコンパイラだと、最適化の過程である程度は自動的にループの外に出してくれるのでわざわざ出すことも無さそうですが。 ソースコードが極端に見ずらくならない範囲で、ソースコードレベルで最適化されたら良いと思います。 openMP化をする前に、このような最適化を行うのが良いと思います。 openMP(4coreとして)と最適化の効果で、10倍以上は速くなるような気がします。

  • ki073
  • ベストアンサー率77% (491/634)
回答No.2

No.1です。 二重、三重のループになっていますが、内側のループの変数はprivate宣言が必要なはずです。 No.1にリンクしているOpenMP入門(1)のp 20あたりを参考に それと、コンパイラのオプション(-fopenmp など)と環境変数の設定(OMP_NUM_THREADS)も忘れていませんか? スレッド生成のオーバーヘッドがありますので、場合によっては効果がないことがあります。 openMPはprivate指定を忘れると正常な結果がでませんので、openMPを使わない状態の結果との比較して、結果が正しいか確認が必要です。 確認ですが、 使用しているOS, CPUの種類(マルチCPUの場合は全体のcore数も)、使用コンパイラ、 それとlwixの値はどの程度でしょうか?

RY0518
質問者

お礼

ありごとうございます。 二重ループの場合、 #pragma omp parallel for private(lwjy) を書き込めば良いのはわかったんですが、三重の場合はどのようにすればよいのでしょうか? またOSはWindows 7、CPUはIntelのコア2、コンパイラはMicrosoft Visual C++ 2010 Expressです。

  • ki073
  • ベストアンサー率77% (491/634)
回答No.1

まずOpenMP入門(1)と(2)を見てください。 http://www2.cc.kyushu-u.ac.jp/scp/system/library/OpenMP/OpenMP.html 要するに、ループの順序が入れ替わっても問題ないところを並列化すればよいのです。 一番外の for( kt=0; kt<=it ; kt++) は順序を入れ替えると駄目ですが、その中のループは入れ替え可能です。 出来るだけ外側の方がスレッドの生成が減らせますので、 for( jx=0; jx<=ix; jx++ ) のループを並列化させます。 多分速くすることが目的でしょうから、もう少し改良できるところがあります。 電界(Ez)の計算の中の、 sigmax[jx][jy][jz]*dt/(2.0*epsirx[jx][jy][jz]) は何度かでてきますので、1つに それと、励振の ez[jx][80][jz] = sin( 2.0*pi*(kt%100)/100 )*sin(pi*float(jx)/float(ix)); は値が変わらないので、ループの外側であらかじめ計算しておいて、この位置で代入すれば計算量が減らせます。 これだけの範囲では分からないのですが、ループの外側に出せる計算があればそれにより計算量を減らせます。 細かいことですが、 /dx, /dyなどの定数の割り算がありますが、割り算はかけ算などに比べて計算時間がかなり必要なので、逆数をあらかじめ計算しておき、その値を掛けることで多少は速くなります。ただしこの変換はコンパイラの最適化で自動的に行われる可能性もあります。

RY0518
質問者

お礼

解答ありがとうございます。 とてもためになりました。 高速化のために改良できるように頑張ってみます。 ちなみに実際に適用したいプログラムのソースコードはこんな感じです。 for( lwkt=0; lwkt<=lwit ; lwkt++) { /* ※※※forの括弧開始※※※ */ /*********** 1ステップ前の電磁界[jt-1]の値の定式 *******/ #pragma omp for for( lwjx=0; lwjx<=lwix; lwjx++ ) for( lwjy=0; lwjy<=lwiy; lwjy++ ) for( lwjz=0; lwjz<=lwiz; lwjz++ ) { lwexg[lwjx][lwjy][lwjz] = lwex[lwjx][lwjy][lwjz]; lweyg[lwjx][lwjy][lwjz] = lwey[lwjx][lwjy][lwjz]; lwezg[lwjx][lwjy][lwjz] = lwez[lwjx][lwjy][lwjz]; } /*********** 光波磁界の計算 ***********/ #pragma omp for for( lwjx=0; lwjx<=lwix; lwjx++ ) for( lwjy=0; lwjy<=lwiy-1; lwjy++ ) for( lwjz=0; lwjz<=lwiz-1; lwjz++ ) { long double lwdey = (lwey[lwjx][lwjy][lwjz+1]-lwey[lwjx][lwjy][lwjz])/lwdz; long double lwdez = (lwez[lwjx][lwjy+1][lwjz]-lwez[lwjx][lwjy][lwjz])/lwdy; lwhx[lwjx][lwjy][lwjz] = lwhx[lwjx][lwjy][lwjz] + lwdt/lwamux[lwjx][lwjy][lwjz] * (lwdey-lwdez); } #pragma omp for for( lwjx=0; lwjx<=lwix-1; lwjx++ ) for( lwjy=0; lwjy<=lwiy; lwjy++ ) for( lwjz=0; lwjz<=lwiz-1; lwjz++ ) { long double lwdez = (lwez[lwjx+1][lwjy][lwjz]-lwez[lwjx][lwjy][lwjz])/lwdx; long double lwdex = (lwex[lwjx][lwjy][lwjz+1]-lwex[lwjx][lwjy][lwjz])/lwdz; lwhy[lwjx][lwjy][lwjz] = lwhy[lwjx][lwjy][lwjz] + lwdt/lwamuy[lwjx][lwjy][lwjz]*(lwdez-lwdex); } #pragma omp for for( lwjx=0; lwjx<=lwix-1; lwjx++ ) for( lwjy=0; lwjy<=lwiy-1; lwjy++ ) for( lwjz=0; lwjz<=lwiz; lwjz++ ) { long double lwdex = (lwex[lwjx][lwjy+1][lwjz]-lwex[lwjx][lwjy][lwjz])/lwdy; long double lwdey = (lwey[lwjx+1][lwjy][lwjz]-lwey[lwjx][lwjy][lwjz])/lwdx; lwhz[lwjx][lwjy][lwjz] = lwhz[lwjx][lwjy][lwjz] + lwdt/lwamuz[lwjx][lwjy][lwjz]*(lwdex-lwdey); } /*********** 光波励振 ***********/ long double lwaz = sin( 0.04*pi*(lwkt%50)); //******* 領域II ******* #pragma omp for for( lwjx=0; lwjx<lwkx1; lwjx++ ) for( lwjz=lwkz1; lwjz<=lwkz2; lwjz++ ) { lwez[lwjx][lwky0][lwjz] = ( cos(lwux)*cos((lwuz/lwtz)*(lwkz0-lwjz)*lwdz-lwfhi) /exp((lwwx/lwtx)*((lwkx0-lwjx)*lwdx-lwtx)) )*lwaz; } //******* 領域III ******* #pragma omp for for( lwjx=lwkx2+1; lwjx<=lwix; lwjx++ ) for( lwjz=lwkz1; lwjz<=lwkz2; lwjz++ ) { lwez[lwjx][lwky0][lwjz] = ( cos(lwux)*cos((lwuz/lwtz)*(lwkz0-lwjz)*lwdz-lwfhi) /exp((lwwx/lwtx)*((lwjx-lwkx0)*lwdx-lwtx)) )*lwaz; } //******* 領域IV ******* #pragma omp for for( lwjx=lwkx1; lwjx<=lwkx2; lwjx++ ) for( lwjz=0; lwjz<lwkz1; lwjz++ ) { lwez[lwjx][lwky0][lwjz] = ( (cos((lwux/lwtx)*(lwkx0-lwjx)*lwdx)*cos(lwuz-lwfhi)) /(exp((lww2z/lwtz)*((lwkz0-lwjz)*lwdz-lwtz))) )*lwaz; } //******* 領域V ******* #pragma omp for for( lwjx=lwkx1; lwjx<=lwkx2; lwjx++ ) for( lwjz=lwkz2+1; lwjz<=lwiz; lwjz++ ) { lwez[lwjx][lwky0][lwjz] = ( (cos((lwux/lwtx)*(lwkx0-lwjx)*lwdx)*cos((lwuz/lwtz)*(lwkz0-lwkz2)*lwdz-lwfhi)) /(exp((lww0z/lwtz)*((lwjz-lwkz0)*lwdz-lwtz))) )*lwaz; } //******* 領域I ******* #pragma omp for for( lwjx=lwkx1; lwjx<=lwkx2; lwjx++ ) for( lwjz=lwkz1; lwjz<=lwkz2; lwjz++ ) { lwez[lwjx][lwky0][lwjz] = cos((lwux/lwtx)*(lwkx0-lwjx)*lwdx)*cos((lwuz/lwtz)*(lwkz0-lwjz)*lwdz-lwfhi)*lwaz; } //******* 領域II-V ******* #pragma omp for for( lwjx=0; lwjx<lwkx1; lwjx++ ) for( lwjz=lwkz2+1; lwjz<=lwiz; lwjz++ ) { lwez[lwjx][lwky0][lwjz] = ( (cos(lwux)*cos((lwuz/lwtz)*(lwkz0-lwkz2)*lwdz-lwfhi)) /(exp((lwwx/lwtx)*((lwkx0-lwjx)*lwdx-lwtx))*exp((lww0z/lwtz)*((lwjz-lwkz0)*lwdz-lwtz))) )*lwaz; } //******* 領域II-IV ******* #pragma omp for for( lwjx=0; lwjx<lwkx1; lwjx++ ) for( lwjz=0; lwjz<lwkz1; lwjz++ ) { lwez[lwjx][lwky0][lwjz] = ( (cos(lwux)*cos(lwuz-lwfhi)) /(exp((lwwx/lwtx)*((lwkx0-lwjx)*lwdx-lwtx))*exp((lww2z/lwtz)*((lwkz0-lwjz)*lwdz-lwtz))) )*lwaz; } ・ ・ ・ この後電界の計算が同じように書かれています。 このようにfor文の前に#pragma omp forを導入したのですがあまり短縮はできませんでした。

関連するQ&A

  • FDTDの数値計算について

    光波の伝搬の計算としてFDTD法を用いる事を考え、Scilabを用いた1次元のFDTD法をまず行うことを考えています。想定する状況は左端に光源があり、空気(屈折率1)を伝搬するという単純なものです。 そこでプログラムを以下のようにしました。 各パラメータは波長ramuda=500*10^-9,dz=ramuda/20,dt=dz/c,透磁率と誘電率mu=ep=1としています。 Hy(1:M)=0; Ex(1:M+1)=0; For n=1:N, Ex(1)=sin(n*dt*c/ramuda); Hy=Hy-dt./mu.*diff(Ex)/dz; Ex(2:M)=Ex(2:M)-dt./ep.*diff(Hy)/dz; end 宇野先生や橋本先生、小舘先生などの本を読む限り条件等はこれでよいはずなのですが、全く伝搬するような計算ができませんでした。数値計算自体慣れていないため、足りない部分があるかと思いますが全く見当がつきませんでした。どうか何が足りていない、何が間違っているなどありましたらご指摘いただきけないでしょうか。

  • 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平面についても同様に書きました。

  • MATLABでのエッジ強度画像の出力と保存

    MATLABで画像処理を行ない,対象とする画像(添付のcell.jpg)の勾配強度画像を得たいと思っております.ただし,その保存がうまくいきません. プログラムは,下記のコードを利用しました. im = imread('C:/work/cell.jpg'); im = rgb2gray(im); %メディアンフィルタで平滑化 J = medfilt2(im); figure(1) imshow(J) %勾配強度画像を求める hy = fspecial('sobel'); hx = hy'; Iy = imfilter(double(J), hy, 'replicate'); Ix = imfilter(double(J), hx, 'replicate'); gradmag = sqrt(Ix.^2 + Iy.^2); %figure, imshow(gradmag,[]), title('Gradient magnitude (gradmag)') imshow(gradmag,[]) 上記のプログラムで正しくエッジ強度画像は出力されるのですが,問題はそれを保存するときです. 「imwrite(gradmag, 'C:/work/cell_grad.jpg','jpg')」 のように保存すると,添付ファイルのようになってしまいます. どのようにしたら解決できますでしょうか. どなたかお分かりになる方がいらっしゃいましたら,ご教示お願い致します.

  • ルンゲクッタ法によるマクスウェルモデルの微分方程式

    大学の課題で dγ/dt=1/G(dσ/dt)+σ/η (但しt=時刻、Gは弾性要素の定数、ηは粘性要素の定数) に γ=1(t≧0) γ=0(t<0) のような階段状の歪みを加えた時 応力σ(t)の時間変化をルンゲクッタ法を用いて時間の刻み幅0.1 時刻20まで求めるプログラムを作成しろ というのがあります。作ってはみたものの ex.c: In function `main': ex.c:20: called object is not a function ex.c:22: called object is not a function ex.c:24: called object is not a function ex.c:26: called object is not a function と表示されて動きません。だれかどこをどう修正すれば良いか教えてください。 #include <stdio.h> double g(double t,double sigma,double z); double f(double t); int main(void){ double t,sigma,dt,count,tstart,z; double x1,x2,x3,x4; sigma=2.0; /*σの初期値を2とした*/ dt=0.1; /*刻み幅0.1*/ count=20.0; /*20まで表示*/ tstart=0.0; /*0から表示*/ for(t=tstart;t<count;t+=dt){ z=(f(t+dt)-f(t))/dt; /* z=dγ/dt */ x1=dt*g(t,sigma,z,); x2=dt*g(t+dt/2,sigma+x1,z); x3=dt*g(t+dt/2,sigma+x2,z); x4=dt*g(t+dt/2,sigma+x3,z); sigma=sigma+(x1+2.0*x2+2.0*x3+x4)/6.0; t=t+dt; printf("%f %f\n", t, sigma); /*tを表示  σを表示*/ } } double f(double t){ double ganma; if(t>=0)ganma=1; /*  γ=1(t≧0)  */ else ganma=0; /*  γ=0(t<0)  */ return(ganma); } double g(double t,double sigma,double z){ double ita,g,uhen; ita=10.0; g=2.0; /*与式を変形をし dσ/dt=(dγ/dt-σ/η)*G  右辺の関数がg()である*/ uhen=(z-sigma/ita)*g; /*η=10 G=2とした*/ return(uhen); } いろいろ調べてみたのですが、dy/dx=x+y などのような微分方程式の解き方は分かるのですが、上記のような微分方程式の解き方がわかりません。だから無理やりdγ/dtを求めて自分が解ける形にもっていったのですが、もっときれいな求め方があるならそれも教えてください。お願いします。

  • 波動方程式の導き方

    電磁気学に関する質問です。次のように、z方向に伝搬定数βで進行し、角周波数ωで進行する波について E=E0(x,y)exp(jωt-βt)・・・(1) H=H0(x,y)exp(jωt-βt)・・・(2) 直交座標系(x,y,z)における波動方程式と円筒座標系(r,φ,z)における波動方程式を求めたいです。 (1),(2)式をマクスウェルの法則に代入して、x,y,z成分に関する式を求めて、式変形によりEx,Ey,Hx,HyをそれぞれEz,Hzを用いて導く事はできました。その後、どのような計算方法で波動方程式を求めればいいのかわかりません。できるだけ計算過程を詳しく教えていただけないでしょうか?よろしくお願いします。

  • 2変数以上の多項式が因数を持つための条件

    2変数2次曲線 ax^2+2hxy+by^2+2fx+2gy+c=0 が1次式×1次式に因数分解され、2直線(複素変数も許す、重なる場合も許す)を表すための条件は、 http://www004.upp.so-net.ne.jp/s_honma/figure/surface.htm にあるように、「xについての判別式=0のyについての判別式=0」や、 同じことですが「行列式{{a, h, f}, {h, b, g}, {f, g, c}}=0」 となります。 すると、3変数2次曲面 ax^2+by^2+cz^2+dxy+eyz+fzx+gx+hy+iz+j=0 が1次式×1次式に因数分解されるための条件とか、 2変数3次曲線 ax^3+bx^2y+cxy^2+dy^3+ex^2+fxy+gy^2+hx+iy+j=0 が1次式×2次式に因数分解されるための条件、1次式×1次式×1次式に因数分解されるための条件 はどうなるのでしょうか? 一般に2変数以上の多項式が因数を持つための条件があればどうか教えてください。

  • 木造許容応力度のねじれ補正係数αについて

    ねじれ補正係数αについて教えてください。x方向で考えると... αx=1+(ΣDx・ey/KT)・Y αx:x方向のねじれ補正係数 ex:y方向の偏心距離 KT:Jx+Jy:ねじり剛性 ΣDx:x方向の水平剛性の総和 Jx:剛心Gを原点とする座標軸xに対する、水平剛性Dxの2次モーメント Jy:剛心Gを原点とする座標軸yに対する、水平剛性Dyの2次モーメント Y:剛心から求めようとする列(耐力壁が存在する列)までの距離(x軸方向の距離)で、重心0の側を正、逆側を負とする。 となります。同じ階で、x方向の壁線(耐力壁の存在する列)で考えると、「ΣDx」「ey」「KT」は、どの壁線(列)も同じ数値で、「Y」(剛心から求めようとする列)だけが変化します。 そこで、この公式の持っている意味は「ねじれを考慮して、重心に近い壁線ほど沢山の地震力を負担させて、重心から遠い壁線には、あまり地震力を負担させない」というように考えて良いのでしょうか?ただ、剛心から求めようとしている壁線(列)が重心側だとすべて「正」で、重心が無い側はすべて「負」というのは極端なようにも思えますが、(実際計算してみても剛心から重心側がすべて1.0を超えていて剛心から反対側はすべて1.0未満となります)そのような事は無いのでしょうか? 宜しくお願いします。

  • マクスウェルの式の立て方とExHの計算方法

    磁場のない、真空中の静電場の中を負極へ落下する電荷qは、電磁波を出すと思いますが、 ExHは どう計算したらいいのでしょうか? 落下する方向をz軸にとると、マクスウェルの方程式は、 ∇・B=0 は、 ∂xBx+∂yBy+∂zBz=0 ∇xE+∂tB=0 は、 0+∂tB=0      。。。 ここが疑問(Bはどんどん増えるのに0とは?) ε∇・E=ρ は、 ∂xEx+∂yEy+∂zEz=ρ ∇xH-ε∂tE=j は、  ∂yHz-∂zHy-ε∂tEx=jx=0 → ∂yHz-∂zHy=0 ∂zHx-∂xHz-ε∂tEy=jy=0  → ∂zHx-∂xHz=0 ∂xHy-∂yHx-ε∂tEz=jz  → ∂xHy-∂yHx=qvz そして、m d/dt vz=qEz  → vz=qEz/m t        → ∂xHy-∂yHx=q^2Ez/m t ↑の疑問点は、、、 ∇xE+∂tB=0 のEを、∇xE≠0 と仮定すると、 ∂yEz-∂zEy +∂tBx=0 → ∂yEz-∂zEy=-μ∂tHx ∂zEx-∂xEz +∂tBy=0  → ∂zEx-∂xEz=-μ∂tHy ∂xEy-∂yEx +∂tBz=0  → ∂xEy-∂yEx=0 で合っているでしょうか? (こうしないと電磁波が出るようにならないと思うので) それで、これからどうやって、EやHを計算したらいいのでしょうか? (∂xHy-∂yHx を消去するのは すぐわかりますが)

  • FDTD法について

    損失媒質の中にアンテナがあり,空気中(真空中)での電界をもとめるには,FDTD,IE3D,FEKOの中でどのシミュレータを用いたら良いですかね??回答よろしくお願いします.

  • 光波解析に使うFDTDについて

    私は現在修士1年でFDTDによる光波解析の研究を行っています。 そこで質問なのですが、FDTDは周波数が高いと解が振動する、あるいは位相誤差が大きくなることが問題となっています。 FDTDプログラムを作ってみて解析を行ったところ、光領域では解析解と比べ、やはり大きい誤差が出てしまいました。 そこでNS-FDTD法を用いたほうがよいという文献を発見しました。しかし、詳しい定式化などの本や文献が少なく困っています。 はたしてNS-FDTD法を使用しなくては光学解析はできないのでしょうか?また、NS-FDTD法使用に境界条件なども変える必要があるのでしょうか? どんなことでもよいので、よろしくお願いします。