質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2619閲覧

【Python】行列における0以外の解の求め方

Masa06

総合スコア2

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/08/02 09:22

前提・実現したいこと

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との併用の仕方が分からず断念しました.
具体的には,複素数計算にて生じる虚数の表現方法が異なる点の取り扱いが分かりませんでした.
ただ,本件が分かったところで解けたかは分かりません.

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

現状の行列Aは|A|は0でなく逆行列を持ちますので、自明解(x=0)しか持ちえません。
非自明解を持つには|A|=0としなければなりません。

なお、|A|=0であっても、Ax=bで表される連立方程式については、擬似逆行列を使うことで解を得ることができます。
numpyにおいて擬似逆行列はnp.linalg.pinv(A)で求められます。

投稿2020/08/02 10:25

編集2020/08/02 11:13
Penpen7

総合スコア698

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Masa06

2020/08/16 14:13

返答が遅くなってしまい失礼しました. ご回答いただきありがとうございます. 擬似逆行列を利用して解決しようと思います.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問