1

p(4) の値を取得しようとしています (申し訳ありません)

式は次のようになります: 4800+p1+p2*z/1000+p3*e^(-p4*z/1000)

次のエラーが表示され続けます: p(4) にアクセスしようとしました。numel(p)=3 であるため、インデックスが範囲外です。

波のエラー (32 行目) xy1 = 4800+5.6596+14.5820/1000*xs+257.4318*exp(-p(4)/1000);

numel の「境界」を変更するにはどうすればよいですか、またはこの問題を解決するために他にできることはありますか?

コード

z = [0.0; 500; 1000; 1500; 2000; 2500; 3000; 3500; 4000; 5000; 6000; 7000; 8000; 9000; 10000; 11000; 12000];
y = [5050 4980 4930 4890 4870 4865 4860 4860 4865 4875 4885 4905 4920 4935 4950 4970 4990]'-4800 ;
A = [ones(numel(z),1) z./1000 exp(-z./1000)];
p = A\y;
norm(p);
y = y+4800;

xs = 0:1:12000;
xy = 4800+5.6596+14.5820/1000*xs+257.4318*exp(-p(4)/1000);
subplot(2,2,4), plot(z,y,'o')
hold on
subplot(2,2,4), plot(xs,xy);
title('p4')

編集:::::::

私はこれを最初に持っていました.p4には開始推測(値)(p4 = 1)があり、次にp1、p2、p3の結果を新しいファイルに入れてp4を解決しようとしました。それが上記のコードです。

z = [0.0; 500; 1000; 1500; 2000; 2500; 3000; 3500; 4000; 5000; 6000; 7000; 8000; 9000; 10000; 11000; 12000];
y = [5050 4980 4930 4890 4870 4865 4860 4860 4865 4875 4885 4905 4920 4935 4950 4970 4990]'-4800 ;
A = [ones(numel(z),1) z./1000 exp(-z./1000)];
p = A\y;
norm(p);
y = y+4800;

xs = 0:1:12000;
xy = 4800+p(1)+p(2)/1000*xs+p(3)*exp(-xs/1000);
subplot(2,2,1), plot(z,y,'o')
hold on
subplot(2,2,1), plot(xs,xy);
title('p1,p2,p3')
4

1 に答える 1

2

ここで説明するモデルに当てはめようとしているという知識を身につけてください。

https://math.stackexchange.com/questions/214797/soundwaves-under-the-water

すなわちf(z) = 4800 + p1 + p2*z/1000 + p3*exp(-z*p4/1000)

問題は、これが非線形方程式であるため、MATLAB バックスラッシュ演算子を単純に使用できないことです。答えが示唆することを行い、最適化ツールボックスでの使用を検討するlsqnonlinか、Curve Fitting Toolbox でカスタム式を適合させる必要があります。

個人的には、Curve Fitting Toolbox に傾倒しており、cftool を使用して次のことを行います。

ここに画像の説明を入力

ここで、係数の推定値が次のようになっていることがわかります。

   p1 =      -20.21  (-29.34, -11.08)
   p2 =       17.34  (16.31, 18.36)
   p3 =       272.9  (263.3, 282.5)
   p4 =      0.7528  (0.6964, 0.8092)

下限と上限がかなり緩いことに注意してください。p1 が常に正であることを確認したい場合は、下限をゼロに設定することで実現できます。

于 2013-05-29T20:36:27.200 に答える