Python
 Computer >> コンピューター >  >> プログラミング >> Python

【Python】NumPyの外積を使ってマンデルブロ集合計算用の複素数グリッドを作成する方法

外積(Outer Product)とは

2つのベクトル a = [a0, a1, ..., aM]b = [b0, b1, ..., bN] が与えられたとき、外積は次のように定義されます。

[[a0*b0  a0*b1  ...  a0*bN ]
[a1*b0     .
[ ...       .
[aM*b0             aM*bN ]]

Pythonで2つの配列の外積を求めるには、numpy.outer() メソッドを使用します。あわせて覚えておきたいのが次の2つの関数です。

  • numpy.ones(): 指定した形状と型をもつ「すべての要素が1」の新しい配列を返します。
  • numpy.linspace(): 指定した区間を等間隔に分割した数値列を返します。

マンデルブロ集合のようなフラクタルを計算する場合には、複素平面上の各点に対応する格子状のデータ(グリッド)が必要です。実部と虚部の配列をそれぞれ外積で生成し、それらを加算することで、複素数のグリッドを簡単に構築できます。

手順

ステップ1:必要なライブラリをインポートする

import numpy as np

ステップ2:実部を作成する

rl = np.outer(np.ones((5,)), np.linspace(-2, 2, 5))
print("複素数の実部...\n", rl)

ここでは、5個の1からなる配列と、-2から2までの等間隔5点の配列との外積を計算することで、各行に同じ実数列が並ぶ5×5の行列を作成しています。

ステップ3:虚部を作成する

im = np.outer(1j*np.linspace(2, -2, 5), np.ones((5,)))
print("\n複素数の虚部...\n", im)

虚部では、-2i〜2i の値を縦方向に並べたいので、1j*np.linspace(2, -2, 5) を行側に配置して外積を取ります。

ステップ4:グリッドを形成する

grid = rl + im

実部と虚部を加算すると、複素平面上の5×5の格子点を表す複素数行列が完成します。

完全なコード例

import numpy as np

# 外積を求めるには numpy.outer() メソッドを使用する
# numpy.ones() はすべての要素が1の新しい配列を返す
# numpy.linspace() は指定した区間の等間隔な数値列を返す

# 実部
rl = np.outer(np.ones((5,)), np.linspace(-2, 2, 5))
print("複素数の実部...\n", rl)

# 虚部
im = np.outer(1j*np.linspace(2, -2, 5), np.ones((5,)))
print("\n複素数の虚部...\n", im)

# グリッドを形成
grid = rl + im
print("\nグリッドの表示...\n", grid)

出力結果

複素数の実部...
[[-2. -1.  0.  1.  2.]
 [-2. -1.  0.  1.  2.]
 [-2. -1.  0.  1.  2.]
 [-2. -1.  0.  1.  2.]
 [-2. -1.  0.  1.  2.]]

複素数の虚部...
[[0.+2.j 0.+2.j 0.+2.j 0.+2.j 0.+2.j]
 [0.+1.j 0.+1.j 0.+1.j 0.+1.j 0.+1.j]
 [0.+0.j 0.+0.j 0.+0.j 0.+0.j 0.+0.j]
 [0.-1.j 0.-1.j 0.-1.j 0.-1.j 0.-1.j]
 [0.-2.j 0.-2.j 0.-2.j 0.-2.j 0.-2.j]]

グリッドの表示...
[[-2.+2.j -1.+2.j  0.+2.j  1.+2.j  2.+2.j]
 [-2.+1.j -1.+1.j  0.+1.j  1.+1.j  2.+1.j]
 [-2.+0.j -1.+0.j  0.+0.j  1.+0.j  2.+0.j]
 [-2.-1.j -1.-1.j  0.-1.j  1.-1.j  2.-1.j]
 [-2.-2.j -1.-2.j  0.-2.j  1.-2.j  2.-2.j]]

まとめ

numpy.outer() を使えば、実部と虚部をそれぞれ独立した配列として作成し、それらを組み合わせて複素平面のグリッドを直感的に構築できます。このグリッドはマンデルブロ集合の反復計算など、複素数平面上での数値計算の土台としてそのまま活用できます。ポイントを整理すると次の通りです。

  • np.ones() × np.linspace() の外積で、行または列方向に値を複製した行列を作れる。
  • 虚部には 1j を掛けることで純虚数の配列を生成できる。
  • 実部+虚部の加算により、複素数のグリッドが一瞬で完成する。
  1. Python TkinterでLabelFrameのスタイルを設定する方法

    TkinterのLabelFrameは、TkinterライブラリにおけるFrameとよく似たウィジェットです。内部に他のウィジェットを配置できるコンテナとして機能し、作成時には矩形の枠線が付いた領域が自動的に生成されます。LabelFrameウィジェットをカスタマイズするには、background(背景色)、borderwidth(枠線の太さ)、labelanchor(ラベルの位置)、highlightcolor(ハイライト色)など、さまざまなスタイルオプションを利用できます。これらのオプションを組み合わせることで、アプリケーションのデザインに合わせた柔軟なUI構築が可能になります。サンプルコ

  2. Pythonプログラム:数の一意な素因数の積を求める方法

    はじめに 本記事では、次の問題に対する解き方を学びます。 問題文: 整数 n が与えられたとき、その数が持つ一意な(重複しない)素因数をすべて求め、それらの積を返します。 例: 入力:num = 11 出力:積は 11 説明: 入力された数は 11 で、素因数は 11 のみです。 したがって、その積も 11 となります。 アプローチ1:総当たり法(ブルートフォース) i = 2 から n+1 までの for ループを使い、i が n の約数であるかどうかを確認します。約数であれば、さらに i 自身が素数かどうかを判定し、素数なら積に掛け合わせます。この処理を i が n に達するまで繰り返しま