前提・実現したいこと
Numpyを利用して,下記の「作成中コード」に記載の行列における0以外の解の求め方が分からず困っています.
求め方のアドバイスを頂けないでしょうか.
※複素数の計算です.
※昨日,同様のコードで別のことを質問しています.
https://teratail.com/questions/281885
※定数は仮の数値を記載しているため,0以外の解はない可能性があります.
作成中のコード
import cmath import numpy as np import scipy from scipy.integrate import quad #積分1 def M(func, a, b, **kwargs): def real_func(r): return scipy.real(func(r)) def imag_func(r): return scipy.imag(func(r)) real_integral = quad(real_func, a, b, **kwargs) imag_integral = quad(imag_func, a, b, **kwargs) return (real_integral[0] + 1j*imag_integral[0], real_integral[1:], imag_integral[1:]) #複素積分計算1 def F_r2(func, a, b, **kwargs): def real_func(r): return scipy.real(func(r)) def imag_func(r): return scipy.imag(func(r)) real_integral = quad(real_func, a, b, **kwargs) imag_integral = quad(imag_func, a, b, **kwargs) return (real_integral[0] + 1j*imag_integral[0], real_integral[1:], imag_integral[1:]) #複素積分計算2 def F_r3(func, a, b, **kwargs): def real_func(r): return scipy.real(func(r)) def imag_func(r): return scipy.imag(func(r)) real_integral = quad(real_func, a, b, **kwargs) imag_integral = quad(imag_func, a, b, **kwargs) return (real_integral[0] + 1j*imag_integral[0], real_integral[1:], imag_integral[1:]) #複素積分計算3 def G_r2(func, a, b, **kwargs): def real_func(r): return scipy.real(func(r)) def imag_func(r): return scipy.imag(func(r)) real_integral = quad(real_func, a, b, **kwargs) imag_integral = quad(imag_func, a, b, **kwargs) return (real_integral[0] + 1j*imag_integral[0], real_integral[1:], imag_integral[1:]) #複素積分計算4 def G_r3(func, a, b, **kwargs): def real_func(r): return scipy.real(func(r)) def imag_func(r): return scipy.imag(func(r)) real_integral = quad(real_func, a, b, **kwargs) imag_integral = quad(imag_func, a, b, **kwargs) return (real_integral[0] + 1j*imag_integral[0], real_integral[1:], imag_integral[1:]) #数値は仮 r0 = 1 r1 = 1 r2 = 1 r3 = 1 vr2 = 1 beta2 = 1 n = 1 Q = 1 ganma = - Q / cmath.tan(beta2) omega = 1 + 1j A_M = M(lambda r: r2 / (r * (cmath.sin(beta2))**2), r2, r1) A_F_r2 = F_r2(lambda r: cmath.exp((-1j* (omega * cmath.pi * (r**2 - r2**2) / Q - n * ganma * cmath.log(r / r2) / Q ))) * (r / r2)**(n + 1), r3, r2) A_F_r3 = F_r3(lambda r: cmath.exp((-1j* (omega * cmath.pi * (r**2 - r2**2) / Q - n * ganma * cmath.log(r / r2) / Q ))) * (r / r3)**(n + 1), r3, r3) A_G_r2 = G_r2(lambda r: cmath.exp((-1j* (omega * cmath.pi * (r**2 - r2**2) / Q - n * ganma * cmath.log(r / r2) / Q ))) * (r2 / r)**(n - 1), r2, r2) A_G_r3 = G_r3(lambda r: cmath.exp((-1j* (omega * cmath.pi * (r**2 - r2**2) / Q - n * ganma * cmath.log(r / r2) / Q ))) * (r3 / r)**(n - 1), r3, r2) #raund_theta算出 raund_theta = cmath.exp(-1j *(omega * cmath.pi * (r3**2 - r2**2) / Q - n * ganma * cmath.log(r3 / r2) / Q)) - ((n - 1) / r3 ) * 0.5 * A_G_r3[0] #各種値計算 a11 = r2 * vr2 a12 = -1 * (1 - cmath.exp(-2* beta2 * 1j)) * ( 1j * r2 * omega / cmath.tan(beta2) - A_M[0] * n * omega ) a13 = -1 * r1**n * omega a14 = -1 * omega / r1**n a22 = (r2/r1) * (1 - cmath.exp(-2* 1j * beta2)) a23 = -1 * omega * r1**(n -1) a24 = -1 * omega / r1**(n + 1) a31 = (1j * omega - ganma /(2 * cmath.pi * r3**2) * 1j * n + Q/(2 * cmath.pi * r3**2)) * (0.5 * A_F_r3[0] - 0.5 * A_G_r3[0] - 1j * (r2 / r3)**(n + 1) * cmath.exp(-2 * 1j * beta2) * (-1j *((0.5 * A_F_r2[0]) + (0.5 * A_G_r2[0])))) + Q/(2 * cmath.pi * r3) * (raund_theta + 1j * (n + 1) * r2**(n + 1) / r3**(n + 2) * cmath.exp(-2 * 1j * beta2) * (-1j * ((0.5 * A_F_r2[0]) + (0.5 * A_G_r2[0])))) a32 = (1j * omega - ganma /(2 * cmath.pi * r3**2) * 1j * n + Q/(2 * cmath.pi * r3**2)) * (-1j * (r3 / r2)**(n - 1) - 1j * (r2 / r3)**(n + 1) * cmath.exp(-2 * 1j * beta2)) + (Q/(2 * cmath.pi * r3)) * (-1j * (n - 1) * r3**(n - 2) / r2**(n - 1) + 1j * (n + 1) * r2**(n + 1) / r3**(n + 2) * cmath.exp(-2 * 1j * beta2)) a43 = omega * r0**(n - 1) a44 = -1 * omega / r0**(n + 1) #行列計算 A = np.matrix([ [a11, a12, a13, a14], [ 0, a22, a23, a24], [a31, a32, 0, 0], [ 0, 0, a43, a44] ]) B = np.matrix([ [0], [0], [0], [0] ]) x = np.linalg.solve(A, B) print(x)
###出力
[[ 0.+0.j] [-0.+0.j] [-0.+0.j] [-0.+0.j]]
試したこと
Sympyにて連立方程式のコードを試そうとしましたが,Numpyとの併用の仕方が分からず断念しました.
具体的には,複素数計算にて生じる虚数の表現方法が異なる点の取り扱いが分かりませんでした.
ただ,本件が分かったところで解けたかは分かりません.
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/08/16 14:13