0

ここに画像の説明を入力してくださいMATLABでとlbを選択する方法がわかりません。また、関数をデータに適合させるために、いくつかの出力がありますが、正しくありません。ublsqcurvefitx0

これが私のデータです:

xdata= [22.8700000000000;7.92000000000000;3.45000000000000;1.78000000000000;
        1.57000000000000;6.41000000000000;12.9000000000000;1.82000000000000;
        1.86000000000000;3.71000000000000;12.0900000000000;15.9900000000000;
        18.9600000000000;23.1500000000000;23.4500000000000;24.8200000000000;
        25.0700000000000;13.2800000000000];
ydata= [8.44300000000000;7.92100000000000;7.64600000000000;7.51600000000000;
        7.47100000000000;7.82100000000000;8.03200000000000;7.76200000000000;
        7.77400000000000;7.87800000000000;8.07000000000000;8.26000000000000;
        8.40000000000000;8.52000000000000;8.52000000000000;8.57000000000000;
        8.58000000000000;8.03200000000000];

次に、myfuncを別のmファイルに入れます。

 function F = myfun(x,xdata)
  F=x(1)*(1-x(2)^2)./((1+x(2)^2+2*x(2)*cosd(xdata)).^1.5);

私は、データに適合させた後に推定したい不明なものを持ってx(1)おり、kが負の値にならないことx(2)を知っています。x(2)

だから私はlsqcurvefitこのように設定しました:

[x, resnorm]=lsqcurvefit(@myfun,[-0.5:0.5], xdata, ydata, 0, 1.5, options)

そしてこれが結果です:

x = 1.5000 -0.4945
resnorm = 52.1739

x(2)これは!の負の値を示します

手伝っていただけませんか?

質問に答えてくれてありがとう。コマンドがxとresnormを計算した後、関数で結果を使用します。これは、x(1)= 92.8054 x(2)=0.7427を使用したことを意味します。

それで;

F = 92.8054 *(1-(0.7427)^ 2)./((1-0.7427)^ 2 + 2 *(0.7427)* cosd(xdata))。^ 1.5;

これで、ベクトルFが得られました。データと結果をプロットすると、plot(xdata、ydata、'o'、xdata、F、'*')

軸yの範囲がそんなに違うのはなぜですか!関数にx(3)を追加する必要があるかもしれません。

フィギュアを付けました。ここに画像の説明を入力してください

ここに画像の説明を入力してください

ここに画像の説明を入力してください

4

3 に答える 3

1

パラメータlbubは出力の下限と上限です。つまり、最適化された値xoptはを満たしlb <= xopt <= ubます。

すでにご存知のように、それx(2)は負の値にはなり得ません。すでに1つの下限、つまりゼロがありますlb(2) = 0。これで、とx(1)の両方の下限と上限を定義するだけで済みます。x(1)x(2)

次のコードは制限x(1) to [-inf, 1e3]x(2) to [0, 1e3]ます:

lb = [-inf, 0];
ub = [1e3, 1e3];
[x, resnorm] = lsqcurvefit(@myfun,[-0.5:0.5], xdata, ydata, 0, 1.5, ...
                           lb, ub, options)

また、あなたのアプローチがうまくいったことに少し戸惑っています。ドキュメントによると、上限または下限がないが提供したい場合は、空のベクトルを渡す必要がありますoptions。つまり、例は次のようになります。

[x, resnorm] = lsqcurvefit(@myfun,[-0.5:0.5], xdata, ydata, 0, 1.5, ...
                           [], [], options)

おそらく、Matlabにはさまざまなバージョンがあります。

于 2012-07-30T11:21:25.180 に答える
1

上限と下限は、推定しようとしているものと同じ数の要素(この場合はx)を持つベクトルである必要があります。

したがって、たとえば、x(1)を無制限にし、x(2)を0から1.5の間にしたい場合は、

[x, resnorm]=lsqcurvefit(@myfun,[-0.5:0.5], xdata, ydata, [-inf, 0], [inf, 1.5], options)

Fを計算するには、作成済みの目的関数を使用します。

F = myfun(x, xdata)そして、それをあなたがすでに持っている方法でプロットします。以下のコメントでは、a+をa-に切り替えています。これが、グラフが整列していない理由です。

于 2012-07-30T11:18:06.333 に答える
0

単純な最小二乗解を使用しない理由:

in = [ones(size(xdata, 1), 1), xdata];
w = in \ ydata;
ydata_fit = in * w;

結果:

ここに画像の説明を入力してください

>> disp(w)
    7.5744
    0.0401
于 2012-07-30T19:12:11.483 に答える