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

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

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

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

Q&A

解決済

1回答

1317閲覧

音圧分布の計算とプロット

sibazyun

総合スコア18

MATLAB

MATLABはMathWorksで開発された数値計算や数値の視覚化のための高水準の対話型プログラミング環境です。

0グッド

1クリップ

投稿2020/06/07 11:51

現在私は点音源が作る音圧分布をプロットしようとしています。
そこで以下のようなプログラミングを書きました。

matlab

1% 定数定義 2f = 100; 3w = 2*pi*f; 4lambda = 340/f; 5k = 2*pi/lambda; 6p = 1.293; 7c = 340; 8A = 1/k^2*p*c; 9r = 1; 10theta = (2 * pi)/4; 11% グリッド作成 12[X,Y,Z] = meshgrid(-3:0.1:3); 13soundposition_x = []; 14soundposition_y = []; 15soundposition_z = []; 16%主な原因と思われる場所 17%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 18%音源の位置計算 19x1 = X - r*cos(theta); 20%x1 = X; 本来r*cos(theta)はゼロになるため誤差を含めなけらばこれと同等のはず 21y1 = Y - r*sin(theta); 22z1 = Z; 23%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 24%音圧計算 25soundsorce1 = (1i*w*p*A/sqrt(x1.^2+y1.^2+z1.^2).*exp(-1i*k*sqrt(x1.^2+y1.^2+z1.^2))); 26anser = abs(soundsorce1); 27xslice = 0; 28yslice = []; 29zslice = 0; 30% プロット部 31slice(X,Y,Z,anser,xslice,yslice,zslice) 32title('3次元空間の音圧分布') 33xlabel('x[m]') 34ylabel('y[m]') 35zlabel('z[m]') 36c = colorbar; 37shading flat

なのですが、音源の位置を

MATLAB

1x1 = X; 2y1 = Y - r*sin(theta); 3z1 = Z; 4%プログラミング中ではr = 1,theta = 2*pi/4

とした時は音圧分布がうまくプロットできるのですが、

matlab

1x1 = X - r*cos(theta); 2y1 = Y - r*sin(theta); 3z1 = Z; 4%プログラミング中ではr = 1,theta = 2*pi/4

とした時に、うまくプロットできません。

本来r*cos(theta)=0なのでどちらのプログラミングも同じ結果が出るはずなのですが、matlab上では誤差の影響なのか6.1232e-17という計算結果になることはわかりました。
しかしこの誤差がどう悪さをしてプロットがうまくできないのかが解明できていません。
多少の誤差が生じたとしても、音源の位置が本来の場所からちょっとずれて音が広がっていく様子が二つ目の図と同じようにプロットされると思ったのですが、うまく点音源の音圧分布がプロットされず困っています。
もし原因がわかる方がいたらご教授よろしくお願いいたします。

※今回音圧の計算に用いたものは以下の式を変形したものです。
また今後比較的楽に音源の数を増やせるようにするためにcos,sinの計算を使用しています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

x1 = X;で計算すると、x1, y1, z1が同時に0になる場所があり、その場所のanserの値はInfになります。具体的にはanser(41,31,31)です。Infがあるときのsliceの動作の仕様は確認できませんでしたが、実際の動作を見る限り、うまく無視しているようです。

一方x1 = X - r*cos(theta);で計算すると、x1が0にならないため、anser(41,31,31)は、非常に大きいがInfではない値になっています。このため、その他の値は元とほぼ同じなのにも関わらず、相対的に非常に小さい値になってしまうため、プロットが変わっています。試しにanser(41,31,31)=Inf;とすると、同じプロットが得られます。

(41,31,31)は音源の場所だと思いますが、うまく無視する必要があると思います。

投稿2020/06/07 15:44

Bearded-Ockham

総合スコア430

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

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

sibazyun

2020/06/08 04:51

わかりやすく、細かいところまで説明ありがとうざいました!!infだった部分がただ非常に大きいだけの値に変わってしまっていたんですね、、。無視する処理を実装したいと思います。 ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問