« #NHKスペシャル 2/4は”シリーズ 人体 神秘の巨大ネットワーク 第5集 “脳” すごいぞ! ひらめきと記憶の正体”でした。速記メモ。 | トップページ | #深イイ話 徳井さんが一番会いたいダンサーとして東京ゲゲゲイが登場。あ、ゲゲゲイの鬼太郎のダンサーか! »

2018年2月 5日 (月)

Excel VBAで複素数演算(一次方程式・FFT他, Numerical Recipes移植)、フィッティング(非線形含む)、ルンゲクッタ8次(DOP853)などが使えるライブラリ その1:複素数演算の基礎

会社では、まあ開発部門は何のプログラム言語を使ってもいいのだけれど
工場ではそういうわけにもいかない。そもそも外部のネットワークに接続できなかったりする。
ちょっとした設計や計測に使うソフトウェアを作って配りたい、
というときに非常に困る。
ソフトウェアを買え、という話もあるが、損益が厳しい工場が買うはずがないのだ。(これを導入したらいくらの売り上げUPか利益率いくらUPが定量的に示せないと何も買わないのだ)
MicrosoftのOfficeくらいならどの工場のPCでも入っている、ということで
フルスクラッチでExcelのマクロ(VBA)で計算・計測プログラムを作って配っていたりする。
DLLですらダウンロードできないので、全部ソースに書いているという。
※ちなみに仕事でやっているわけでなくて、単なるサービスというか、趣味。
 私はもはやエンジニアでもないのだったりする。
ということで、今回はそのライブラリを紹介します。まあそれなりにみんなに使ってもらっているので致命的なバグはないと思いますが、細かいミスはご勘弁を、、、(責任は全くとらない方向で)
まずライブラリ本体:
またルンゲクッタ8次のDOP853ルーチンとそのドライバ。
メルセンヌツイスタ用
――
今回は第一回ということで複素数演算などの使い方。
Numerical Recipesについてはこちらから本が丸ごと読めます。
まずはVBAの編集画面から、ファイルのExportを行い、
ComplexMath.bas
を読み込みます。これで複素数演算(FFT,連立一次方程式,逆行列)、フィッティング(線形・非線形)などが
使える状態になります。
複素数は構造体で定義されています。
Public Type Complex
    x As Double
    y As Double
End Type
この変数を作るときは、
Dim x As Complex
のように宣言します。
もちろん、配列も宣言できます。行列を作るには
Dim A() as Complex
Redim A(3,3)
とすれば可変長の行列ができます。
※Numerical Recipesの表現に合わせたので、0からではなくて1からです。
 明示的に最初に Option BASE 1 としておくと便利
値を代入するには、
z = ToComplex(1.2, 3.5)
のように実部と虚部に分けて設定することができます。
この場合 z=1.2+3.5i と入力したことに相当します。
また
z = x
のように別の複素数は直接代入できます。
四則演算については +,-,×,÷はそれぞれ
    z = Cadd(x, y)
    z = Csub(x, y)
    z = Cmul(x, y)
    z = Cdiv(x, y)
Cdiv(x,y)のみ順番に注意が必要で、x/yの意味です。
複素共役,絶対値、偏角はそれぞれ、
z=Conj(z), a=Cabs(z), p=CPhase(z)
実数部分、虚数部分を取り出すにはそれぞれ
a=Rez(z), b=Imz(z)
などとします。
※ついでに角度が±πに対応したatan2(x,y)という関数も使えます。x/y=tanθの逆関数。
複素数の指数、対数関数、べき乗関数はそれぞれ(多価関数は±πのみを取る)
z=Cexp(x), z=Clog(x), z=Cpow(x,y)となる。ただしべきはz=x^yの意味。
--
では次回はFFTを。
--
こちらも参照:

« #NHKスペシャル 2/4は”シリーズ 人体 神秘の巨大ネットワーク 第5集 “脳” すごいぞ! ひらめきと記憶の正体”でした。速記メモ。 | トップページ | #深イイ話 徳井さんが一番会いたいダンサーとして東京ゲゲゲイが登場。あ、ゲゲゲイの鬼太郎のダンサーか! »

パソコン・インターネット」カテゴリの記事

学問・資格」カテゴリの記事

日記・コラム・つぶやき」カテゴリの記事

コメント

複素数VBA, ComplexMath.basについて。

便利なVBAありがとうございます。 すこしテストしてみましたが
atan2(x,y) にはバグがあると思います。
部分だけ示しますと:

If x = 0# Then
'------------- ★★バグ修正★24/10/22 by sd
' pi --> pi/2#
If y > 0 Then
atan2 = pi / 2#
Exit Function
Else
atan2 = -pi / 2#
Exit Function
End If
End If
・・・オリジナルは atan2= ±pi となっていましたが、これは明らかに ±pi/2が正しいですね。

また、次は必ずしも必然ではありませんが、普通atan2の主値は
(-pi/2, pi/2] とするのが普通で、オリジナルでは [-pi/2, pi/2) となっています。
If x > 0 Then
atan2 = Atn(y / x)
Else
If y > 0 Then  ’*** y>=0 が普通の主値***
atan2 = pi + Atn(y / x)
Else
atan2 = -pi + Atn(y / x)
End If
End If

ご参考まで。


コメント:
atan2(x,y)で、x=y=0のとき atan2=0 と定義したのは先見の明がありましたね。
このおかげで 0^0=1が自然に出てきて、使いやすいルーチンになった、
と思います。

コメントを書く

(ウェブ上には掲載しません)

« #NHKスペシャル 2/4は”シリーズ 人体 神秘の巨大ネットワーク 第5集 “脳” すごいぞ! ひらめきと記憶の正体”でした。速記メモ。 | トップページ | #深イイ話 徳井さんが一番会いたいダンサーとして東京ゲゲゲイが登場。あ、ゲゲゲイの鬼太郎のダンサーか! »

最近の記事

2025年2月
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28  

最近のコメント

無料ブログはココログ
フォト