上記サイトのソースコードの
>> % オプションで値を指定すると固定値境界に, replicateを指定すると値のコピー, circularを指定すると周期境界になる.
U = 2.*U1 - U2 + c^2.*imfilter(U1, F, 'replicate').*dt*dt;
値を以下のように指定して u(hnx,0,t)=u(0,hny,t)=u(hnx,1,t)=u(1,hny,t)=0 固定値境界にしたいです。 このときどう書けばいいのでしょうか?
よろしくお願いします

 채택된 답변

michio
michio 2018년 1월 25일

0 개 추천

有限差分に imfilter を使うのは面白い活用例ですね。
>> % オプションで値を指定すると固定値境界に
とあるように、
U = 2.*U1 - U2 + c^2.*imfilter(U1, F, 100).*dt*dt;
などと数値を入れると配列の境界の外に位置する値(上の例だと 100) とし、計算を行います。何も指定しないと 0 であると想定します。

댓글 수: 5

Soto Honda
Soto Honda 2018년 1월 25일
回答ありがとうございます。 自分で関数を入れるわけではなく、そのまま値を代入すればよかったんですね。 助かります。 また波形が固定値境界に達したときにループから脱出できる方法を教えてもらえると幸いです。
michio
michio 2018년 1월 25일
if condition
break;
end
を for ループ内に入れてやればOKですが、波形が境界に達した、という条件(上記の condition )をどう書き下すかが課題ですね。なにか案はありますか?
境界付近の値は
Uleft = U(1,:);
Ubottom = U(:,1);
Uright = U(end,:);
Utop = U(:,end);
と参照できるので、”これらの値のどこかが初期値(Qiitaの例だと 0.5) から変化した”という条件式を書いてやるのも1つの方法かと思います。挑戦してみてください。
Soto Honda
Soto Honda 2018년 1월 25일
丁寧に説明していただきありがとうございます。波形が境界に達する条件式はUが先ほど決めた固定値境界に達するということではないのでしょうか?
michio
michio 2018년 1월 25일
Qiitaのページでは
U = zeros(ny, nx)+0.5; % とりあえず水面は0.5の高さ
と設定しており、Uの初期値は 0.5 の模様です。ここで固定値境界を 0 に設定して計算すると、境界側から何らかの波が発生していしまうのではと想像しています。
”波形が境界に達する”ということは何を意味するのか、物理的な側面からも妥当だと思われる条件を考えてみてください。正解があるわけではない、面白い課題だと思います。
Soto Honda
Soto Honda 2018년 1월 25일
たくさんの助言ありがとうございます。 いただいたアドバイスをもとのに自分でシミュレーションしていきます。 ありがとうございました。

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

질문:

2018년 1월 24일

댓글:

2018년 1월 25일

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!