1

nlinfit でフィッティングの問題が発生しています。フィット感を改善する方法がわかりません。TolX または TolFun を減少させても、coeffs の値は変化しません。

 model = @(a,x) 1./(1 + a*x.^2); 
 model0 = [1e13];  
 opts = statset('TolX', 1e-25, 'TolFun', 1e-25); 
 coeffs = nlinfit(freqData, noiseData, model, model0, opts);

これが私の適合です。 http://i.imgur.com/v1dkd4X.png

4

2 に答える 2

2

非常に小さな数値を扱っているように見えるため、浮動小数点の精度に問題がある可能性があります。式を別の式に変換してから、フィットしてから逆変換しないのはなぜですか? 例えば:

変換する1/modelと、単純な多項式フィッティングが得られます。

model_new=(x,a)=1+a*x.^2

あなたが使用できる場所polyfitpolyval、次に取る1/result...

于 2013-07-23T22:57:17.723 に答える
1

スケーリングせずに、あなたに似たシミュレートされたデータに適合します。

ここに画像の説明を入力

秘訣は、データを調べることです。信号の振幅は、x~40 と ~150 の間で ~1.5 から ~1.0 に低下しています。しかし、関数を調べると、その値が 1 を下回ってはならないことが明らかであるため、データを適切にモデル化できません。

このデータは、初期振幅を含めることでより適切に適合します。

model_new = @(a,x) a(1)./(1 + a(2)*x.^2); 

データにプロットされたフィッティング関数を見ると、スケーリング パラメーターもどこかに含まれているように見えます。

振幅パラメーターを含めると、元の関数が改善されますが、必ずしも安全ではありません。データにノイズがあり、あまり低下しないため、不確実性 (および相関関係) が大きくなると予想できます。

x=0 までのデータがなく、適切なスケーリング係数がどうあるべきかわからないため、フィッティングの前にデータをスケーリングしても、おそらくここではあまり役に立ちません。

于 2013-07-24T04:37:04.077 に答える