« すぐコンサル的な人は問題と課題は違うというが、あれは誰が言い出したんだろうか。マナー講師みたいなルール。辞書的には同じ風で、たぶん英語ならIssueとTask(Challenge)のような感じで違うものをわざと同じような単語でごまかしている?…戦略と戦術も同じ匂いがする。 | トップページ | Excelの自動化がいつの間にかVBAじゃなくてデスクトップ版でもOfficeスクリプト(TypeScript)で出来るようになっていた。Python in Excelとか触っているうちに出遅れた…そこで先日作った複素数クラスを使ってセルに入力した値を複素数計算できるようにした。 »

2024年4月 3日 (水)

TypeScriptで複素数クラスを作って複素数の四則演算、exp、べき、logの計算ができるようにした。大昔にJavaScriptで作ったり、数値計算ライブラリmathjsを使ったりしたがもうちょっとお手軽なものが欲しかったので。

だいぶ昔にこれを書いたが、いまだによくアクセスがある。ただ全くJavaScriptの知識がないまま書いたのでいまいち。

Javascriptで複素数を扱うライブラリ

一方JavaScript/TypeScriptには数値計算ライブラリ math.jsというのがあってしばらく遊んでいた。最後につけているリンク参照。

これはこれで便利だが、複素数だけ使いたいというときには大げさ。

なので、今度はTypeScriptで複素数クラスを作ってみた。今回もほぼTypeScriptの知識はないのだが…

こんな感じのcomplex.tsを作って、

export class complex
{
    x : number;
    y : number;
    constructor(x : number, y : number) {
        this.x = x;
        this.y = y;
    }
    set Re(x : number) {
        this.x = x;
    }
    get Re() : number {
        return this.x;
    }
    set Im(y : number) {
        this.y = y;
    }
    get Im() : number {
        return this.y;
    }
    static add(a : complex, b : complex) : complex {
        return new complex(a.x + b.x, a.y + b.y);
    }
    static sub(a : complex, b : complex) : complex {
        return new complex(a.x - b.x, a.y - b.y);
    }
    static mul(a : complex, b : complex) : complex {
        return new complex(a.x*b.x-a.y*b.y, a.x*b.y+a.y*b.x);
    }
    static div(a : complex, b : complex) : complex {
        const r2= b.x*b.x + b.y*b.y;
        return new complex((a.x*b.x+a.y*b.y)/r2, (-a.x*b.y+a.y*b.x)/r2);
    }
    static conj(a: complex) : complex {
        return new complex(a.x, -a.y);
    }
    static exp(a: complex) : complex  {
        return new complex(Math.exp(a.x)*Math.cos(a.y),Math.exp(a.x)*Math.sin(a.y));
    }
    static log(a: complex) : complex  {
        const r2= a.x*a.x + a.y*a.y;
        return new complex(0.5*Math.log(r2), Math.atan2(a.y,a.x));
    }
    static pow(a: complex, b: complex) : complex  {
        return complex.exp(complex.mul(complex.log(a),b));
    }
    static abs(a : complex) : number {
        return Math.sqrt(a.x*a.x+a.y*a.y);
    }
    static arg(a: complex) : number {
        return Math.atan2(a.y,a.x);
    }
    static toString(a : complex) : string {
        if (a.y < 0) {
            return a.x.toString()  + a.y.toString() + "i";
        } else {
            return a.x.toString() + "+" + a.y.toString() + "i";
        }
    }
}

 

これをこんな感じで使う。

import {complex} from './complex'

const a = new complex(1,2);
const b = new complex(3,4);
console.log("add : " + complex.toString(complex.add(a,b)));
console.log("sub : " + complex.toString(complex.sub(a,b)));
console.log("mul : " + complex.toString(complex.mul(a,b)));
console.log("div : " + complex.toString(complex.div(a,b)));
console.log("exp : " + complex.toString(complex.exp(a)));
console.log("log : " + complex.toString(complex.log(a)));
console.log("pow : " + complex.toString(complex.pow(a, b)));
console.log("conj: " + complex.toString(complex.conj(a)));
console.log("abs : " + complex.abs(a));
console.log("arg : " + complex.arg(a));
結果はこうなる。
add : 4+6i
sub : -2-2i
mul : -5+10i
div : 0.44+0.08i
exp : -1.1312043837568135+2.4717266720048188i
log : 0.8047189562170501+1.1071487177940904i
pow : 0.1290095940744669+0.03392409290517001i
conj: 1-2i
abs : 2.23606797749979
arg : 1.1071487177940904

[Done] exited with code=0 in 0.758 seconds
 

結構お手軽に計算できた。さてこれで何をやろうとしているかというと(続く)。 

<math.jsの事例>

JavaScriptの数値計算ライブラリmathjsを使う(1) まずは行列演算。LU分解で一次方程式を解き、逆行列と行列式を求める。このココログで直接計算できる機能も付けた。

JavaScriptの数値計算ライブラリmathjsを使う(2) 次は複素数演算。四則演算や平方根、べき乗、expなどが簡単にできる。このココログで直接計算できる簡易電卓を作ってみた。

JavaScriptの数値計算ライブラリmathjsを使う(3) Plotlyを併用して関数をグラフ表示する。ココログでもグラフ表示できるようになった。

JavaScriptの数値計算ライブラリmathjsを使う(4) 高速フーリエ変換(FFT)を計算してココログにplotlyでグラフ表示できるようにする。。

JavaScriptの数値計算ライブラリmathjsを使う(5) 複素行列の固有値・固有ベクトルを求める。ココログで計算できるようにした。

JavaScriptの数値計算ライブラリmathjsを使う(6) 特異値分解(SVD)、主成分分析(PCA)を計算してみる。このココログでも計算できるようにした。

JavaScriptの数値計算ライブラリmathjsを使う(7) マンデルブロ集合を描く。このココログでも計算して図示できるようにしてみた。

JavaScriptの数値計算ライブラリmathjsを使う(8) 4段4次のルンゲクッタ法でローレンツ方程式を計算。このココログでもPlotlyで3次元でぐりぐり動かせるようにしてみた。

JavaScriptの数値計算ライブラリmathjsを使う(9) 仏陀のお姿のフラクタル Buddhabrot(ブッダブロ)を描く。このココログでも計算できるようにしてみた。

JavaScriptの数値計算ライブラリmathjsを使う(10) リーマンゼータ関数(Riemann Zeta function)を計算、3次元化してPlotlyでぐりぐり動かす

今回のコードのVisual Studio Codeの画像:

Typescriptcomplex1 Typescriptcomplex2

« すぐコンサル的な人は問題と課題は違うというが、あれは誰が言い出したんだろうか。マナー講師みたいなルール。辞書的には同じ風で、たぶん英語ならIssueとTask(Challenge)のような感じで違うものをわざと同じような単語でごまかしている?…戦略と戦術も同じ匂いがする。 | トップページ | Excelの自動化がいつの間にかVBAじゃなくてデスクトップ版でもOfficeスクリプト(TypeScript)で出来るようになっていた。Python in Excelとか触っているうちに出遅れた…そこで先日作った複素数クラスを使ってセルに入力した値を複素数計算できるようにした。 »

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

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

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

コメント

コメントを書く

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

« すぐコンサル的な人は問題と課題は違うというが、あれは誰が言い出したんだろうか。マナー講師みたいなルール。辞書的には同じ風で、たぶん英語ならIssueとTask(Challenge)のような感じで違うものをわざと同じような単語でごまかしている?…戦略と戦術も同じ匂いがする。 | トップページ | Excelの自動化がいつの間にかVBAじゃなくてデスクトップ版でもOfficeスクリプト(TypeScript)で出来るようになっていた。Python in Excelとか触っているうちに出遅れた…そこで先日作った複素数クラスを使ってセルに入力した値を複素数計算できるようにした。 »

最近の記事

最近のコメント

2024年12月
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
29 30 31        
フォト
無料ブログはココログ