誤差のない音律データを求めて。
音律計算やその他について、気になった事をまったりと書いていこうと思います。
元ブログ(主にgoo、一部blogger)からの引越し。電波度を減らそうと試みた事もあるがちょっと難しそうだ。

ミジンコ並の耳コピ能力?

 絶対音感は周波数を感じ取る力。相対音感は周波数比を感じ取る力。

もちろん周波数と言っても何ヘルツと数字で言えなくても音高が分かれば良いと思う。あとどちらの音感も「有るか無いか」ではなく精度の問題だ。絶対音感で言えば「半音の精度で言い当てるレベル」「オクターブの違いくらいしか分からないレベル」「半音の間隔を10分割されても区別できるレベル」「誤差1ヘルツくらいで分別できるレベル」などが考えられる。

 「音名」は絶対音程と言えるかも。音名と条件(a=440Hzなど)から周波数を求める事ができる。「階名」は相対音程と言えるかも。階名と条件(音律など)から周波数比を求める事ができる。

 「固定ド」は「ドレミ」を音名に使う方法。「移動ド」は「ドレミ」を階名に使う方法。そして自分の脳は移動ドしか理解できない。固定ドを否定したいのではなくただそうなっているだけ。(正誤の問題もあるかもしれないが今は考えない。)

以上が前置き1。自分が耳コピで頼れるのは相対音感の移動ド。しかも臨時記号が出てくると処理速度&能力がガタ落ちする不完全版。

 

 少し前、アメリカvsベネズエラの問題があった頃にyoutubeを見ていたらベネズエラワルツの動画が出てきたのでタイムリーだなぁと思いながら見ていた。ワルツ2はクラシックギターで昔弾いてみた曲だ。人に聞いてもらえるレベルではないけれど、曲の難易度は低めな割に音楽的には豊かで好きな曲だった。ピアノでも弾いてみたいと思った。楽譜付き動画だったので頑張って楽譜ソフトmusescoreに書き写した(ラウロのベネズエラワルツ2と3)。楽譜が手に入った事により草ピアニストとしては名曲を存分に味わえて大成功。

以上が前置き2。楽譜ソフトは結構ありがたい。

 

 youtubeを見ていると演奏難易度が低そうで自分でも弾いてみたい曲もある。でも楽譜も手掛かりもない。とりあえず耳コピ難易度が低くて好きな曲から挑戦だ。

 

移動ド 最小単位八分音符(臨時記号は後置)

(弱起) ソラシドミソ

ラーーーーーーー ーーシドレドシレ ソーーーーーーー ーーラシドシラド

ファーーーーーーー ーーミファソファミレ ミーーーーーーー ーーミーファーソー

ラーーーーーーー ーーソ#ラシラソ#シ ドーーーーーーー ーーラシドシラド

レーーーーーラー シーーーーーシー ドーーーーーーー ーー

主旋律だけは何とか手書きしてみたが内声はギブアップしたくなった。内声と低音は楽譜ソフトmusescoreを頼る事にした。音符をセットする時に音が鳴るし演奏も可能なので耳コピの大きな助けになると分かった。

 

ファミコン版ウィザードリィ1 冒険者の宿(木管三重奏)

 

耳コピ完全成功したのはこの曲が初めてかも知れない。聴いた曲を楽譜にする事自体が音楽鑑賞にもなっている。musescoreには演奏機能だけでなく動画エクスポート機能もあると知ったのでyoutubeに上げてリンクを張ってみた。

www.youtube.com

 

余談1

 前置き1と似たような事をどこかで書いたような気がするがさっぱり忘れてしまった。

 

余談2

 楽譜編集の段階ではその楽器で演奏できない音(音域外の音)は赤い音符で表示される。最初は黒に戻したかったが音域外である事が分かった方が良いと考えを改めて赤いままにした。しかし静止画や動画でエクスポートすると赤い音符は黒くされてしまった。残念。

 

 

4点を通る球面(3次元空間内)その6

「4点を通る球面 エクセル」でヤフー検索した結果、AIがlinest関数を活用した解説が出てきた(これもタイミングや使用pcによって出たり出なかったり)。

(前置き部分や構成は「3点円その6」を加筆修正)

 


以前作ったグーグルドライブの「n+1点を通るn次関数」シートを開いてlinest関数(と逆行列関数)の使用例を再確認した。

 10点を通る9次関数

 D4:D13= 10点のy座標

 F4:F13= 10点のx座標

下記2数式は同じ結果を出力する。1行10列で左からx^9の係数~定数項

 =ArrayFormula(transpose(mmult(minverse(F4:F13^{9,8,7,6,5,4,3,2,1,0}),D4:D13)))

 =ArrayFormula(linest(D4:D13,F4:F13^{1,2,3,4,5,6,7,8,9}))

 


当時作った2数式はやや洗練されてなかったので今回少し改良した。その2数式やlinest関数について調べた結果、linest関数の特徴が分かってきた。

 1.定数項の出力は必ず最後(最右)になる。

 2.変数の出力は数式とは逆順になり、数式の変数(x等)と値(y)の引き数の位置も逆行列を使った数式とは逆になっている。

それらを踏まえて4点を通る球面のシートにlinest関数を追加してみた。

今回は乱数を有効にした。但しスクショは欲しい結果が出るまでガチャを回したw

 


グーグルドライブ 数式等

 x1:z4= 元行列

 ah7:ah10= =ArrayFormula(transpose(LINEST(MMULT(X1:Z4^2,-{1;1;1}),X1:Z4)))

 af7:af10= =ArrayFormula(mmult({0,0,1,0;0,1,0,0;1,0,0,0;0,0,0,1},transpose(LINEST(MMULT(X1:Z4^2,-{1;1;1}),X1:Z4))))

 x10:aa10= =ArrayFormula(MMULT({1,1,1,1},mmult({0,0,1,0;0,1,0,0;1,0,0,0;0,0,0,1},transpose(LINEST(MMULT(X1:Z4^2,-{1;1;1}),X1:Z4)))^{1,0,0,2;0,1,0,2;0,0,1,2;0,0,0,1}*{-1,0,0,1;0,-1,0,1;0,0,-1,1;0,0,0,-4})^{1,1,1,0.5}/2)

 x11:aa11= =ArrayFormula(MMULT({1,1,1,1},AE7:AE10^{1,0,0,2;0,1,0,2;0,0,1,2;0,0,0,1}*{-1,0,0,1;0,-1,0,1;0,0,-1,1;0,0,0,-4})^{1,1,1,0.5}/2)

 aa7= =ArrayFormula(MMULT({1,1,1,1},AD7:AD10^{2;2;2;1}*{1;1;1;-4})^0.5/2)  (作ったのは後だがx11:aa11の数式のプロトタイプみたいな数式となった)

 

グーグルドライブ 主にシート画像

 

グーグルドライブ 主にグラフ画像

 

リブレオフィス25・エクセル2019 数式等

 x1:z4= 元行列

 ah7:ah10= {=TRANSPOSE(LINEST(MMULT(X1:Z4^2,-{1;1;1}),X1:Z4))} (配列数式)

 af7:af10= {=MMULT({0,0,1,0;0,1,0,0;1,0,0,0;0,0,0,1},TRANSPOSE(LINEST(MMULT(X1:Z4^2,-{1;1;1}),X1:Z4)))} (配列数式)

  x10:aa10= {=MMULT({1,1,1,1},MMULT({0,0,1,0;0,1,0,0;1,0,0,0;0,0,0,1},TRANSPOSE(LINEST(MMULT(X1:Z4^2,-{1;1;1}),X1:Z4)))^{1,0,0,2;0,1,0,2;0,0,1,2;0,0,0,1}*{-1,0,0,1;0,-1,0,1;0,0,-1,1;0,0,0,-4})^{1,1,1,0.5}/2} (配列数式)

 x11:aa11= {=MMULT({1,1,1,1},AE7:AE10^{1,0,0,2;0,1,0,2;0,0,1,2;0,0,0,1}*{-1,0,0,1;0,-1,0,1;0,0,-1,1;0,0,0,-4})^{1,1,1,0.5}/2} (配列数式)

 aa7= {=MMULT({1,1,1,1},AD7:AD10^{2;2;2;1}*{1;1;1;-4})^0.5/2} (配列数式)  (作ったのは後だがx11:aa11の数式のプロトタイプみたいな数式となった)

 

リブレオフィス25 画像

 

エクセル2019 画像

 

 

余談1

 linest関数は行列式が0(4点を通る球面は存在しない)でも結果を出してしまう事がある。元々近似を求める関数だから仕方ないが注意点ではある。

 

余談2

 グーグル検索とヤフー検索は結果が同じ事が多かったのでスルーしていた。気の迷いで検索してみたらAIが違う結果を出してきて今回の記事に繋がった。

 

余談3

 linest関数を使った数式では「x^2やx^3等」は「変数xの2乗や3乗」と見るより「x^2という変数やx^3という変数」と見るべきかもしれない。linest関数の特性というより多変数連立方程式の特性なのだろうか?

 

余談4

 エクセルの散布図の空白データで失敗する件について、「エクセル 散布図 空白 無視」で検索してAIが関数「na()」を使うと良いと教えてくれた(どこかのサイトに感謝)。早速使ったら成功した。

 

 

試運転版(数日間は凡ミス等を修正する予定。)

 

3点を通る円(2次元平面内)その6

「4点を通る球面 エクセル」でヤフー検索した結果、AIがlinest関数を活用した解説が出てきた(これもタイミングや使用pcによって出たり出なかったり)。

 

以前作ったグーグルドライブの「n+1点を通るn次関数」シートを開いてlinest関数(と逆行列関数)の使用例を再確認した。

 10点を通る9次関数

 D4:D13= 10点のy座標

 F4:F13= 10点のx座標

下記2数式は同じ結果を出力する。1行10列で左からx^9の係数~定数項

 =ArrayFormula(transpose(mmult(minverse(F4:F13^{9,8,7,6,5,4,3,2,1,0}),D4:D13)))

 =ArrayFormula(linest(D4:D13,F4:F13^{1,2,3,4,5,6,7,8,9}))

 

当時作った2数式はやや洗練されてなかったので今回少し改良した。その2数式やlinest関数について調べた結果、linest関数の特徴が分かってきた。

 1.定数項の出力は必ず最後(最右)になる。

 2.変数の出力は数式とは逆順になり、数式の変数(x等)と値(y)の引き数の位置も逆行列を使った数式とは逆になっている。

それらを踏まえて3点を通る円のシートにlinest関数を追加してみた。

今回は乱数を有効にした。但しスクショは欲しい結果が出るまでガチャを回したw

 

グーグルドライブ 数式等

 x1:y3= 元行列

 ah7:ah9= =ArrayFormula(transpose(LINEST(MMULT(X1:Y3^2,-{1;1}),X1:Y3)))

 af7:af9= =ArrayFormula(mmult({0,1,0;1,0,0;0,0,1},transpose(LINEST(MMULT(X1:Y3^2,-{1;1}),X1:Y3))))

 x10:z10= =ArrayFormula(MMULT({1,1,1},mmult({0,1,0;1,0,0;0,0,1},transpose(LINEST(MMULT(X1:Y3^2,-{1;1}),X1:Y3)))^{1,0,2;0,1,2;0,0,1}*{-1,0,1;0,-1,1;0,0,-4})^{1,1,0.5}/2)

 x11:z11= =ArrayFormula(MMULT({1,1,1},AE7:AE9^{1,0,2;0,1,2;0,0,1}*{-1,0,1;0,-1,1;0,0,-4})^{1,1,0.5}/2)

 z7= 

=ArrayFormula(MMULT({1,1,1},AD7:AD9^{2;2;1}*{1;1;-4})^0.5/2)  (作ったのは後だがx11:z11の数式のプロトタイプみたいな数式となった)

 

グーグルドライブ 画像

 

リブレオフィス25・エクセル2019 数式等

 x1:y3= 元行列

 ah7:ah9= {=TRANSPOSE(LINEST(MMULT(X1:Y3^2,-{1;1}),X1:Y3))} (配列数式)

 af7:af9= {=MMULT({0,1,0;1,0,0;0,0,1},TRANSPOSE(LINEST(MMULT(X1:Y3^2,-{1;1}),X1:Y3)))} (配列数式)

 x10:z10= {=MMULT({1,1,1},MMULT({0,1,0;1,0,0;0,0,1},TRANSPOSE(LINEST(MMULT(X1:Y3^2,-{1;1}),X1:Y3)))^{1,0,2;0,1,2;0,0,1}*{-1,0,1;0,-1,1;0,0,-4})^{1,1,0.5}/2} (配列数式)

 x11:z11= {=MMULT({1,1,1},AE7:AE9^{1,0,2;0,1,2;0,0,1}*{-1,0,1;0,-1,1;0,0,-4})^{1,1,0.5}/2} (配列数式)

 z7= {=MMULT({1,1,1},AD7:AD9^{2;2;1}*{1;1;-4})^0.5/2} (配列数式)  (作ったのは後だがx11:z11の数式のプロトタイプみたいな数式となった)

 

リブレオフィス25 画像

 

エクセル2019 画像

 

余談1

 linest関数は行列式が0(3点を通る円は存在しない)でも結果を出してしまう事がある。元々近似を求める関数だから仕方ないが注意点ではある。

 

余談2

 グーグル検索とヤフー検索は結果が同じ事が多かったのでスルーしていた。気の迷いで検索してみたらAIが違う結果を出してきて今回の記事に繋がった。

 

余談3

 linest関数を使った数式では「x^2やx^3等」は「変数xの2乗や3乗」と見るより「x^2という変数やx^3という変数」と見るべきかもしれない。linest関数の特性というより多変数連立方程式の特性なのだろうか?

 

 

試運転版(数日間は凡ミス等を修正する予定。)

 

4点を通る球面(3次元空間内)その5

4点を通る球面(4点球)について、今回の新しい事項は主に下記の2点。新しいと言っても前回(3点円)と同じだが。

 

1.行列の次数を1つ下げる方法を知った。

 「4点を通る球面 エクセル」で検索するとAIが逆行列関数を使った解説が増えてきた(自分の環境だけかもしれないが)。タイミングの違いかpc(複数使用)の違いか分からないが連立方程式で変数を1つ減らしてから逆行列関数を使った解説を見かけた。たぶんAIは実在のサイトを参照したと思う。せっかくなので活用してみた。

 

2.散布図で綺麗な円を書いてみた。

 散布図で円を書く場合、xを等間隔にして円の上側と下側の2つに分けて書く方法しか思いつかなかった。でもネットでは散布図っぽい円グラフで同じ書き方をしている図はあまり見かけない。そうか、「xを等間隔」じゃなくて「角度を等間隔=360度をn分割」にすれば綺麗な円が書けそうだ。そう思って多少試行錯誤してみた。

 

グーグルドライブ 数式

x1:aa4= 元行列  (今回は乱数不使用)

ad7:ad10= =ArrayFormula(mmult(minverse(X1:AA4),mmult(X1:AA4^2,-{1;1;1;0})))

ae7:ae9= =ArrayFormula(MMULT(MINVERSE(MMULT({1,-1,0,0;1,0,-1,0;1,0,0,-1},X1:Z4)),MMULT(MMULT({1,-1,0,0;1,0,-1,0;1,0,0,-1},X1:Z4^2),-{1;1;1})))  次数下げを行列計算で対応。4x3行列に左から3x4定数行列をかけて3x3行列を作った。

ae10= =ArrayFormula(-MMULT(X1:Z1^2,{1;1;1})-MMULT(X1:Z1,AE7:AE9))

x8:ab8=  l,m,n,oから個別計算

x9:z9= =ArrayFormula(TRANSPOSE(MMULT(MINVERSE(mmult({1,0,0,-1;0,1,0,-1;0,0,1,-1},X1:Z4)),MMULT(mmult({1,0,0,-1;0,1,0,-1;0,0,1,-1},X1:Z4^2),{1;1;1}))/2))  次数下げを行列計算で対応。ae7:ae9と同じ手法

aa9= =ArrayFormula(MMULT( (X1:Z1-X9:Z9)^2,{1;1;1})^0.5)

x10:aa10= =ArrayFormula(MMULT({1,1,1,1},MMULT(MINVERSE(X1:AA4),MMULT(X1:AA4^2,-{1;1;1;0}))^{1,0,0,2;0,1,0,2;0,0,1,2;0,0,0,1}*{-1,0,0,1;0,-1,0,1;0,0,-1,1;0,0,0,-4})^{1,1,1,0.5}/2)  行列計算と配列計算を駆使して無理やり1数式にまとめた。

 

y12= 64  円を64個の点で書く

y13= -0.1

中略

x19= =$X$8+$AA$8*cos(asin( ($Z$8-Y$13)/$AA$8))*cos(2*pi()*(row()-row($W$19))/Y$12)

y19= =$Y$8+$AA$8*cos(asin( ($Z$8-Y$13)/$AA$8))*sin(2*pi()*(row()-row($W$19))/Y$12)

x20:y82= x19:y19をコピペ

 

 

グーグルドライブ 主にシートの画像

 

 

グーグルドライブ 主にグラフの画像

 

リブレオフィス25・エクセル2019 数式

x1:aa4= 元行列  (今回は乱数不使用)

ad7:ad10= {=MMULT(MINVERSE(X1:AA4),MMULT(X1:AA4^2,-{1;1;1;0}))}

ae7:ae9= {=MMULT(MINVERSE(MMULT({1,-1,0,0;1,0,-1,0;1,0,0,-1},X1:Z4)),MMULT(MMULT({1,-1,0,0;1,0,-1,0;1,0,0,-1},X1:Z4^2),-{1;1;1}))} (配列数式) 次数下げを行列計算で対応。4x3行列に左から3x4定数行列をかけて3x3行列を作った。

ae10= {=-MMULT(X1:Z1^2,{1;1;1})-MMULT(X1:Z1,AE7:AE9)} (配列数式)

x8:aa8= l,m,n,oから個別計算

x9:z9= {=TRANSPOSE(MMULT(MINVERSE(MMULT({1,0,0,-1;0,1,0,-1;0,0,1,-1},X1:Z4)),MMULT(MMULT({1,0,0,-1;0,1,0,-1;0,0,1,-1},X1:Z4^2),{1;1;1}))/2)} (配列数式)  次数下げを行列計算で対応。ae7:ae9と同じ手法

aa9= {=MMULT( (X1:Z1-X9:Z9)^2,{1;1;1})^0.5} (配列数式)

x10:aa10= {=MMULT({1,1,1,1},MMULT(MINVERSE(X1:AA4),MMULT(X1:AA4^2,-{1;1;1;0}))^{1,0,0,2;0,1,0,2;0,0,1,2;0,0,0,1}*{-1,0,0,1;0,-1,0,1;0,0,-1,1;0,0,0,-4})^{1,1,1,0.5}/2} (配列数式) 行列計算と配列計算を駆使して無理やり1数式にまとめた。エクセルではエラー。


y12= 64  円を64個の点で書く

中略

x19= =$X$10+$AA$10*COS(ASIN( ($Z$10-Y$13)/$AA$10))*COS(2*PI()*(ROW()-ROW($W$19))/Y$12)

y19= =$Y$10+$AA$10*COS(ASIN( ($Z$10-Y$13)/$AA$10))*SIN(2*PI()*(ROW()-ROW($W$19))/Y$12)

x20:y82= x19:y19をコピペ

 

リブレオフィス25 主にシートの画像

 

リブレオフィス25 主にグラフの画像

 

エクセル2019 主にシートの画像

 

エクセル2019 主にグラフの画像

 

mathによる数式画像1

 

mathによる数式画像2

 

 

余談1

 エクセルはグーグルドライブをダウンロードして修正。グラフが化けて戸惑ったが空白の扱いを指定することで問題の一部が解決した。グラフの範囲に空白が含まれるとうまくいかないようなので個別にグラフの範囲を設定をした。もし4点の行がとびとびだった場合、うまくいかなかったと思う。

 

余談1の追記 r080618

 「エクセル 散布図 空白 無視」でグーグル検索してAIが「na()」関数を使えば良いと教えてくれた。問題解決した。

 

余談2

 エクセルではx10:aa10がエラーになってしまった。おまけと言うか余興みたいなノリなのでとりあえずそのまま放置。

 

余談2の追記 r080618

 乱数を変化させると成功する事もあり理屈はいまだに分からない。行列計算と配列計算の乱用がダメなのか?配列数式の挙動が分からないのはもやもやするので一応解明したい気もするが今のところ手掛かりなし。

 

余談3

 毎回ではないけれど検索でのAIの答えで「未知数・既知数」という単語を見かけたこともある。「変数・定数」よりも分かりやすいと思った。過去記事を書き換えるかどうかは考え中。

 

 

試運転版(数日間は凡ミス等を修正する予定。) r080618試運転版解除

 

3点を通る円(2次元平面内)その5

3点を通る円(3点円)について、今回の新しい事項は主に下記の2点。4点球については次回予定。

 

1.行列の次数を1つ下げる方法を知った。

 「4点を通る球面 エクセル」で検索するとAIが逆行列関数を使った解説が増えてきた(自分の環境だけかもしれないが)。タイミングの違いかpc(複数使用)の違いか分からないが連立方程式で変数を1つ減らしてから逆行列関数を使った解説を見かけた。たぶんAIは実在のサイトを参照したと思う。せっかくなので活用してみた。

(3点円で検索した場合、AIが出なかったり逆行列を使わない解説だったり。)

 

2.散布図で綺麗な円を書いてみた。

 散布図で円を書く場合、xを等間隔にして円の上側と下側の2つに分けて書く方法しか思いつかなかった。でもネットでは散布図っぽい円グラフで同じ書き方をしている図はあまり見かけない。そうか、「xを等間隔」じゃなくて「角度を等間隔=360度をn分割」にすれば綺麗な円が書けそうだ。そう思って多少試行錯誤してみた。

 

グーグルドライブ 数式

x1:z3= 元行列  (今回は乱数不使用)

ad7:ad9= =ArrayFormula(mmult(minverse(X1:Z3),mmult(X1:Z3^2,-{1;1;0})))

ae7:ae8= =ArrayFormula(MMULT(MINVERSE(MMULT({1,-1,0;1,0,-1},X1:Y3)),MMULT(MMULT({1,-1,0;1,0,-1},X1:Y3^2),-{1;1})))  次数下げを行列計算で対応。3x2行列に左から2x3定数行列をかけて2x2行列を作った。

ae9= =ArrayFormula(-MMULT(X1:Y1^2,{1;1})-MMULT(X1:Y1,AE7:AE8))

x8:aa8=  l,m,nから個別計算

x9:y9= =ArrayFormula(TRANSPOSE(MMULT(MINVERSE(mmult({1,0,-1;0,1,-1},X1:Y3)),MMULT(mmult({1,0,-1;0,1,-1},X1:Y3^2),{1;1}))/2))  次数下げを行列計算で対応。ae7:ae8と同じ手法

z9= =ArrayFormula(MMULT( (X1:Y1-X9:Y9)^2,{1;1})^0.5)

x10:z10= =ArrayFormula(MMULT({1,1,1},MMULT(MINVERSE(X1:Z3),MMULT(X1:Z3^2,-{1;1;0}) )^{1,0,2;0,1,2;0,0,1}*{-1,0,1;0,-1,1;0,0,-4})^{1,1,0.5}/2)  行列計算と配列計算を駆使して無理やり1数式にまとめた

 

y12= 64  円を64個の点で書く

中略

x18= =x8  z18= =y8  実は先に作った4点球シートをコピーして修正したのがこの3点円シート。空いてしまったp4の代わりに円の中心p0を書いてみた。

x19= =$X$8+$Z$8*cos(2*pi()*(row()-row($W$19))/Y$12)

y19= =$Y$8+$Z$8*sin(2*pi()*(row()-row($W$19))/Y$12)

x20:y82= x19:y19をコピペ

 

グーグルドライブ シートとグラフの画像

 

リブレオフィス25・エクセル2019 数式

x1:z3= 元行列  (今回は乱数不使用)

ad7:ad9= {=MMULT(MINVERSE(X1:Z3),MMULT(X1:Z3^2,-{1;1;0}))}

ae7:ae8= {=MMULT(MINVERSE(MMULT({1,-1,0;1,0,-1},X1:Y3)),MMULT(MMULT({1,-1,0;1,0,-1},X1:Y3^2),-{1;1}))} (配列数式) 次数下げを行列計算で対応。3x2行列に左から2x3定数行列をかけて2x2行列を作った。

ae9= {=-MMULT(X1:Y1^2,{1;1})-MMULT(X1:Y1,AE7:AE8)} (配列数式)

x8:aa8=  l,m,nから個別計算

x9:y9= {=TRANSPOSE(MMULT(MINVERSE(MMULT({1,0,-1;0,1,-1},X1:Y3)),MMULT(MMULT({1,0,-1;0,1,-1},X1:Y3^2),{1;1}))/2)} (配列数式)  次数下げを行列計算で対応。ae7:ae8と同じ手法

z9= {=MMULT( (X1:Y1-X9:Y9)^2,{1;1})^0.5} (配列数式)

x10:z10= {=MMULT({1,1,1},MMULT(MINVERSE(X1:Z3),MMULT(X1:Z3^2,-{1;1;0})  )^{1,0,2;0,1,2;0,0,1}*{-1,0,1;0,-1,1;0,0,-4})^{1,1,0.5}/2} (配列数式) 行列計算と配列計算を駆使して無理やり1数式にまとめた


y12= 64  円を64個の点で書く

中略

x18= =x8  z18= =y8  実は先に作った4点球シートをコピーして修正したのがこの3点円シート。空いてしまったp4の代わりに円の中心p0を書いてみた。

x19= =$X$8+$Z$8*COS(2*PI()*(ROW()-ROW($W$19))/Y$12)

y19= =$Y$8+$Z$8*SIN(2*PI()*(ROW()-ROW($W$19))/Y$12)

x20:y82= x19:y19をコピペ

 

リブレオフィス25 シートとグラフの画像 スクショ時はae7:ae9は未入力

 

エクセル2019 シートとグラフの画像

 

 

mathによる数式画像1 r080606追加

 

mathによる数式画像2 r080606追加

 

 

余談1

 エクセルはグーグルドライブをダウンロードして修正。グラフが化けて戸惑ったが空白の扱いを指定することで一応落ち着いた。

 

 

試運転版(数日間は凡ミス等を修正する予定。) r080618試運転版解除

順列・階乗進数・十進数その6

文字や文字列を並べる順列

ここでも十進数から直接順列を求めている。そして検算も兼ねて順列から十進数も求めた。今回は順列・階乗進数・十進数その5の宿題の一つである「対象が単純な数字ではなく文字や文字列」とした。微修正と言えば微修正だが予想よりは苦労した。

 

グーグルドライブ 頭素維持型 文字列対版

五一= '作業用'!A1:A5  一五= '作業用'!A1:E1

'作業用'!A1= ="a"  '作業用'!A2= ="b"

'作業用'!A3= ="bc"  '作業用'!A4= ="bd"

'作業用'!A5= ="e"  '作業用'!A6= ="ef"

'作業用'!A7= ="g"  '作業用'!A8= ="h"

b2= =ArrayFormula('作業用'!A1:A8)

c2= =index(五一,INT(MOD(row()-2,FACT(5))/FACT(5-1))+1)

d2= =ArrayFormula(index(五一,1/LARGE(IF(MMULT(IF(五一=$C2:C2,1,0),TRANSPOSE(COLUMN($C2:C2)*0+1)),0,1)/ROW(五一),INT(MOD(row()-2,FACT(COLUMN($C2)-COLUMN(C2)+5-1))/FACT(COLUMN($C2)-COLUMN(C2)+5-2))+1)))

e2:g2= d2をコピペ  c2:g2を3~121行にコピペ

h2= =ArrayFormula(mmult(mmult(column(一五)*0+1,(transpose(mmult(column(一五),if(五一=C2:G2,1,0)))<(mmult(column(一五),if(五一=C2:G2,1,0))))*(row(五一)>column(一五))),fact(5-row(五一))))

h2を3~121行にコピペ

 

グーグルドライブ 末素維持型 文字列対版

m2= =index(五一,5-INT(MOD(row()-2,FACT(5))/FACT(5-1)))

l2= =ArrayFormula(index(五一,LARGE(IF(MMULT(IF(五一=$M2:M2,1,0),TRANSPOSE(COLUMN($M2:M2)*0+1)),0,1)*ROW(五一),INT(MOD(row()-2,FACT(COLUMN(M2)-COLUMN($M2)+5-1))/FACT(COLUMN(M2)-COLUMN($M2)+5-2))+1)))

i2:k2= l2をコピペ  i2:m2を3~121行にコピペ

n2= =ArrayFormula(mmult(mmult(column(一五)*0+1,(transpose(mmult(column(一五),if(五一=I2:M2,1,0)))>(mmult(column(一五),if(五一=I2:M2,1,0))))*(row(五一)<column(一五))),fact(row(五一)-1)))

n2を3~121行にコピペ

 

グーグルドライブ 画像 文字列対版

要素数5と6の最初部分 要素数6以上は軽量化のため一部空白化

要素数5と6の120行付近 他部分の画像は省略

 

エクセル2019・リブレオフィス25 頭素維持型 文字列対版

五一= 作業用!$A$1:$A$5・$作業用.$A$1:$A$5

一五= 作業用!$A$1:$E$1・$作業用.$A$1:$E$1

作業用!$A$1=・$作業用.$A$1= ="a"  作業用!$A$2=・$作業用.$A$2= ="b"

作業用!$A$3=・$作業用.$A$3= ="bc"  作業用!$A$4=・$作業用.$A$4= ="bd"

作業用!$A$5=・$作業用.$A$5= ="e"  作業用!$A$6=・$作業用.$A$6= ="ef"

作業用!$A$7=・$作業用.$A$7= ="g"  作業用!$A$8=・$作業用.$A$8= ="h"

b2= {=作業用!A1:A8}・{=$作業用.A1:A8} (配列数式)

c2= {=INDEX(五一,INT(MOD(ROW()-2,FACT(5))/FACT(5-1))+1)} (配列数式)

d2= {=INDEX(五一,1/LARGE(IF(MMULT(IF(五一=$C2:C2,1,0),TRANSPOSE(COLUMN($C2:C2)*0+1)),0,1)/ROW(五一),INT(MOD(ROW()-2,FACT(COLUMN($C2)-COLUMN(C2)+5-1))/FACT(COLUMN($C2)-COLUMN(C2)+5-2))+1))} (配列数式)

e2:g2= d2をコピペ  c2:g2を3~121行にコピペ

h2= {=MMULT(MMULT(COLUMN(一五)*0+1,(TRANSPOSE(MMULT(COLUMN(一五),IF(五一=C2:G2,1,0)))<(MMULT(COLUMN(一五),IF(五一=C2:G2,1,0))))*(ROW(五一)>COLUMN(一五))),FACT(5-ROW(五一)))} (配列数式)

h2を3~121行にコピペ

 

エクセル2019・リブレオフィス25 末素維持型 文字列対版

m2= {=INDEX(五一,5-INT(MOD(ROW()-2,FACT(5))/FACT(5-1)))} (配列数式)

l2= {=INDEX(五一,LARGE(IF(MMULT(IF(五一=$M2:M2,1,0),TRANSPOSE(COLUMN($M2:M2)*0+1)),0,1)*ROW(五一),INT(MOD(ROW()-2,FACT(COLUMN(M2)-COLUMN($M2)+5-1))/FACT(COLUMN(M2)-COLUMN($M2)+5-2))+1))} (配列数式)

i2:k2= l2をコピペ  i2:m2を3~121行にコピペ

n2= {=MMULT(MMULT(COLUMN(一五)*0+1,(TRANSPOSE(MMULT(COLUMN(一五),IF(五一=I2:M2,1,0)))>(MMULT(COLUMN(一五),IF(五一=I2:M2,1,0))))*(ROW(五一)<COLUMN(一五))),FACT(ROW(五一)-1))} (配列数式)

n2を3~121行にコピペ

 

リブレオフィス25 画像 文字列対版

要素数5と6の最初部分 要素数6以上は軽量化のため一部空白化

 

要素数5と6の120行付近 他部分の画像は省略

 

エクセル2019 画像 文字列対版

要素数5と6の最初部分 要素数6以上は軽量化のため一部空白化

 

要素数5と6の120行付近 他部分の画像は省略

 

 

余談1

 最初は「いろはにほへと」で作った。ただ文字だけでなく文字列も可能な事を明示したかったので今回の形にした。その際、数式は変更してない。

 

余談2

 残った宿題は「候補の一部を対象にした順列」だけど難しそうなので長期間放置しそうな気がする。

 

余談3 r080530

 限界に挑戦。結論から言うと要素数16の数値と文字・文字列で順列列挙成功。リブレオフィス25にて(グーグルドライブとエクセル2019では要素数14)。と言っても全部列挙した訳ではなく最初の6行と最後の6行を表示しただけなので途中にエラーない事を確認した訳ではない。でも区分で分けて何度も繰り返せば理論的には全部列挙できると思う。

 経緯として、要素数9と10の数値と文字・文字列で順列列挙の最初の6行と最後の6行を表示してみた。そして最大いくつまで順列列挙できるか気になっていろいろ試してみた。

 まず「=fact(n)-1」を計算してそれがちゃんと整数として表示される限界(たとえば末尾が「99」とか指数表示になる一歩手前とか)を調べた。

 で、要素数17から始めて余裕だったら増やしてダメだったら減らす方針で開始した。グーグルドライブはセル数の限界とかで別途ファイル作成が必要だった。エクセル2019はグーグルドライブのダウンロードなのでその辺の限界は不明。

 

 

試運転版(数日間は凡ミス等を修正する予定。) r080602試運転版解除

 

順列・階乗進数・十進数その5

ここでは十進数から直接順列を求めている。そして検算も兼ねて順列から十進数も求めた。

ただ改めて「順列」でググってみると並べる対象は数字だけではなく文字や文字列の場合もあるし「全部」だけでなく「一部」の場合もある。行列式の項を並べる事に関連して順列にたどり着いた自分としては現状で充分だけど、まだまだ「順列列挙の完成版」には届いてないと思い知った。

 

順列・階乗進数・十進数その3の「これが最終形か?」の数式を再掲。

 

グーグルドライブ 頭素維持型 (手直し前)

五一= '作業用'!A1:A5

BS1= =5-int(mod($A1,fact(5))/fact(4))

BR1= =ArrayFormula(LARGE(IF(MMULT(IF(ROW(五一)=BS1:$BS1,1,0),TRANSPOSE(COLUMN(BS1:$BS1)*0+1)),0,1)*ROW(五一),INT(MOD($A1,FACT(COLUMN()-COLUMN($BO1)+1))/FACT(COLUMN()-COLUMN($BO1)))+1))

BO1:BQ1= BR1をコピペ  BO1:BS1を2~120行にコピペ

 

エクセル2019・リブレオフィス 頭素維持型 (手直し前)

五一= 作業用!$A$1:$A$5・$作業用.$A$1:$A$5

BS1= =5-INT(MOD($A1,FACT(5))/FACT(4))

BR1= {=LARGE(IF(MMULT(IF(ROW(五一)=BS1:$BS1,1,0),TRANSPOSE(COLUMN(BS1:$BS1)*0+1)),0,1)*ROW(五一),INT(MOD($A1,FACT(COLUMN()-COLUMN($BO1)+1))/FACT(COLUMN()-COLUMN($BO1)))+1)} (配列数式)

BO1:BQ1= BR1をコピペ  BO1:BS1を2~120行にコピペ

 

洗練されてない感満載なので少し手直ししてみた。

 

グーグルドライブ 頭素維持型 (手直し後)

五一= '作業用'!A1:A5  一五= '作業用'!A1:E1

c2= =INT(MOD($A2,FACT(5))/FACT(5-1))+1

d2= =ArrayFormula(1/LARGE(IF(MMULT(IF(ROW(五一)=$C2:C2,1,0),TRANSPOSE(COLUMN($C2:C2)*0+1)),0,1)/ROW(五一),INT(MOD($A2,FACT(COLUMN($C2)-COLUMN(C2)+5-1))/FACT(COLUMN($C2)-COLUMN(C2)+5-2))+1))

e2:g2= d2をコピペ  c2:g2を3~121行にコピペ

h2= =ArrayFormula(mmult(mmult(column(一五)*0+1,(transpose(C2:G2)<C2:G2)*(row(五一)>column(一五))),fact(5-row(五一))))

h2を3~121行にコピペ

 

グーグルドライブ 末素維持型 (手直し後)

m2= =5-INT(MOD($A2,FACT(5))/FACT(5-1))

l2= =ArrayFormula(LARGE(IF(MMULT(IF(ROW(五一)=M2:$M2,1,0),TRANSPOSE(COLUMN(M2:$M2)*0+1)),0,1)*ROW(五一),INT(MOD($A2,FACT(COLUMN(M2)-COLUMN($M2)+5-1))/FACT(COLUMN(M2)-COLUMN($M2)+5-2))+1))

i2:k2= l2をコピペ  i2:m2を3~121行にコピペ

n2= =ArrayFormula(mmult(mmult(column(一五)*0+1,(transpose(I2:M2)>I2:M2)*(row(五一)<column(一五))),fact(row(五一)-1)))

n2を3~121行にコピペ

 

グーグルドライブ 画像

要素数5と6の最初部分 要素数6以上は軽量化のため一部空白化

 

要素数5と6の120行付近

 

要素数8の最初部分

 

要素数8の最後部分

 

名前付き範囲

 

エクセル2019・リブレオフィス 頭素維持型 (手直し後)

五一= 作業用!$A$1:$A$5・$作業用.$A$1:$A$5

一五= 作業用!$A$1:$E$1・$作業用.$A$1:$E$1

c2= =INT(MOD($A2,FACT(5))/FACT(5-1))+1

d2= {=1/LARGE(IF(MMULT(IF(ROW(五一)=C2:$C2,1,0),TRANSPOSE(COLUMN(C2:$C2)*0+1)),0,1)/ROW(五一),INT(MOD($A2,FACT(COLUMN($C2)-COLUMN(C2)+5-1))/FACT(COLUMN($C2)-COLUMN(C2)+5-2))+1)} (配列数式)

e2:g2= d2をコピペ  c2:g2を3~121行にコピペ

h2= {=MMULT(MMULT(COLUMN(一五)*0+1,(TRANSPOSE(C2:G2)<C2:G2)*(ROW(五一)>COLUMN(一五))),FACT(5-ROW(五一)))} (配列数式)

h2を3~121行にコピペ

 

エクセル2019・リブレオフィス 末素維持型 (手直し後)

m2= =5-INT(MOD(ROW()-2,FACT(5))/FACT(5-1))

l2= {=LARGE(IF(MMULT(IF(ROW(五一)=M2:$M2,1,0),TRANSPOSE(COLUMN(M2:$M2)*0+1)),0,1)*ROW(五一),INT(MOD(ROW()-2,FACT(COLUMN(M2)-COLUMN($M2)+5-1))/FACT(COLUMN(M2)-COLUMN($M2)+5-2))+1)} (配列数式)

i2:k2= l2をコピペ  i2:m2を3~121行にコピペ

n2= {=MMULT(MMULT(COLUMN(一五)*0+1,(TRANSPOSE(I2:M2)>I2:M2)*(ROW(五一)<COLUMN(一五))),FACT(ROW(五一)-1))} (配列数式)

n2を3~121行にコピペ

 

リブレオフィス 画像

要素数5と6の最初部分 要素数6以上は軽量化のため部分的に空白化

 

要素数5と6の120行付近

 

要素数8の最初部分

 

要素数8の最後部分

 

名前付き範囲

 

エクセル2019 画像

要素数5と6の最初部分 要素数6以上は軽量化のため部分的に空白化

 

要素数5と6の120行付近

 

要素数8の最初部分

 

要素数8の最後部分

 

名前付き範囲

(r080528追記 値が空白でないのは次の記事の都合。特に問題ないのでそのまま使用)

 

今回の手直しにより、似たような式を別の場所に作る場合の手間がかなり減ったと思う。「横方向に移動して微修正して縦方向にコピペ」により要素数6~8も作った。

 

 頭素セル(c2)の数式は元になる数(a列)が1か所、要素数(5)が2か所

 最左の非頭素セル(d2)の数式は元になる数(a列)が1か所、要素数(5)が2か所、作業用が2か所、頭素セル~左一セルの範囲(C2:$C2)が2か所、頭素セル($C2)と左一セル(C2)が2か所ずつ。

 

余談1

 ここの画像を用意している間に要素が文字や文字列の順列も一応作れてしまった。

 

余談2

 最初はa列に「=row()-2」と入力してあった。ただ約4万行をそれで埋めるのは重くなる気がしたので数式側でa列の代わりに「row()-2」を使った。

 

試運転版(数日間は凡ミス等を修正する予定。) r080528試運転版解除