0

私は、与えられた距離(d)における信号受信パワー(p)の測定値と未知の係数n1およびn2を持つモデルを持っています。私がしなければならないのは、n1とn2の値がRMSエラーを最小限に抑えることです。私はlsqnonlinを使って解決策を見てきましたが、区分的に定義された関数では解決しませんでした。私はmatlabで本当のnoobだと私は多くのトラブルを抱えている、助けてください!これまでのところ、私はmodel.mスクリプトウィッヒを定義したmodelモデルフィッティングMATLAB

上記の式を定義しています:

与えられたモデルです

function y = modelo(d,ht,hr,h0,f,data) 
y=NaN(size(d)); 
c=3*10^8; 
lambda=c/f; 
rbp = 4*(ht-h0)*(hr-h0)/lambda 
if d <= rbp 
    y = 20*log10(4*pi/lambda)+10*@(x)x(1)*log10(d)-data; 
else 
    y =20*log10(4*pi/lambda)+10*@(x)x(1)*log10(d) + 10*@(x)x(2)*log10(d)-data; 
end 

dパラメータは、距離ベクトルであり、データが測定され、その距離の電力。他のパラメータはすべて固定数です。

次に、lsqnonlinを使用しようとしていますが、動作しません。どのようにこれを解決するための任意のアイデアですか?

答えて

1

私はあなたの質問にコメントし、私が先に行っていくつかの事柄を明らかにする十分な評判を持っていないように見え、あなたがやろうとしていることを推測するために最善を尽くしました。それでは、始めましょう。

仮定

  1. lsqnonlinfitしたがって、あなたがそれにあげる機能は、出力差分値(測定 - 予測)する必要がありますあなたが合格機能のSSEを最小限に抑えます。あなたのコードで

問題

  1. あなたの文は、区分的関数の条件を満たしていることを確認するためにチェックしない場合。あなたのifはそれをチェックします。< = dbpですが、そのdrefはありません< = d。
  2. ifステートメントは、あなたが思うように機能しません。 d <= dbpのようなものを実行し、dがスカラーでなければ、あなたのリターンはdと同じサイズになります。 if文は機能しません。
  3. このコード行y = 20*log10(4*pi/lambda)+10*@(x)x(1)*log10(d)-data;は機能しません(どちらもどちらも動作しません)。あなたがここでやっていることは、数値(20*log10(4*pi/lambda))と無名関数(10 * @(x)x(1)* log10(d) - データ)を一緒に追加しようとしていることです。
  4. modelo関数には、パラメータとして渡されるパラメータとしてn1とn2がありません。以下は

    あなたのモデロ機能を固定で

私の試みは、MATLAB関数は動作するはずということです。ファイルの最後には重要な実装の詳細がいくつかあります。

function diff = modelo(ns, d, p, lambda, dRef, dBp) 
% Extracting n1 and n2 so that code is easier to read. 
n1 = ns(1); 
n2 = ns(2); 

% Preallocating the size of PL 
PL = NaN(size(d)); 

% Indicies for the two sections of the piecewise function 
i1 = (dRef <= d) & (d <= dBp); 
i2 = (d > dBp); 

% Calculating the output value for the d values that fall in the first 
% range 
PL(i1) = ... 
    20 .* log10(4 .* pi .* dRef ./ lambda) + ... 
    10 .* n1 .* log10(d(i1) ./ dRef); 

% Calculating the output values for the d values taht fall in the second 
% range 
PL(i2) = ... 
    20 .* log10(4 .* pi .* dRef ./ lambda) + ... 
    10 .* n1 .* log10(dBp ./ dRef) + ... 
    10 .* n2 + log10(d(i2) ./ dBp); 

% Note that by initializing PL to NaN, any values of d outside of the two 
% ranges of this function will result in a output of NaN. 

% Calculates the difference between the estimated value (PL) and the 
% measure value (p). 
diff = PL - p; 
end 

注:lsqnonlinを、Xは、あなたがのためにフィッティングされている値であるフォームfunc(x)のように入力機能を必要とします。この場合、modelo関数の形式はmodelo(ns, d, p, lambda, dRef, dBp)です。この作業を行うには、無名関数を使用する必要があります。ですからからlsqnonlinをを呼び出すファイルには、次のようなものになります。lsqnonlinをするためにその呼び出しの内部で何が起こっている

% Initial guesses for n1 and n2, n1 will be the 1st entry and n2 the 2nd. 
n0 = ...; 
% Distance data, as a vector 
D = ...; 
% Power data, as a vector 
P = ...; 
% Value of lambda 
LAMBDA = ...; 
% Value of dRef 
DREF = ...; 
% Value of dBp 
DBP = ...; 

% Calling lsqnonlin 
ns = lsqnonlin(@(n) modelo(n, D, P, LAMDA, DREF, DBP), n0); 

を我々は匿名関数の内部でモデロの呼び出しをラップ変換していることです。無名関数は単一の変数(n)を取ります。したがって、lsqnonlinの要件に適合します。 modeloはまだ他のすべての情報を渡す必要があることに注意してください。これは無名関数の中で行います。私は、この事実を強調するために渡される変数名を大文字にしました。

+0

ありがとうございました!今ではn1とn2を計算することができました。 ||と&&の演算子は論理スカラ値に変換可能でなければならないので、最初のif条件を修正しなければならなかったので、最初の条件(dRef <= d)を削除しました.dRefが1 dのすべてのdiが1より大きい場合、それをテストする必要はありません。私はあなたにその価値を知らせなかったので、私はあなたにその価値を知らせなかった。 私のデータでテストを行い、それは私にn1 = 2.2261とn2 = -3.2028を与えました。それで、私は上記の係数でモデルの値を計算しようとしましたが、それは私に非常に与えました –

+0

@RoniBerezin私はそれがうまく動作してうれしいです。 &&は、実際には自分のミスです(私はファイルに修正しました)。私は2つのマリジを比較しているので&&を使わないと言っていました。 [推理](https://stackoverflow.com/questions/1379415/whats-the-difference-between-and-in-matlab) – user9985

+0

...私が持っているデータと比較して遠い値。私はそれが間違って計算するかもしれないと思う。与えられたn1とn2を使ってそのモデルのdのすべてのdiの値を計算する方法を知っていますか?あなたの助けをありがとう –