2016-07-11 20 views
0

Ich habe eine Reihe von verrauschten Daten und möchte eine benutzerdefinierte Gleichung, obwohl es in MATLAB. Als nächstes würde ich die Werte der Koeffizienten nehmen und sie in meinem Algorithmus verwenden. Aber ich stecke fest und ich kann nicht herausfinden warum. Ich verwende eine nichtlineare Gleichung a + b * log10 (x1-dcos (alpha-x2)), wobei x1, x2 und der Antwortwert bekannt sind. Das erste Problem sind die Koeffizienten von a, b und alpha müssen begrenzt sein. Alpha hier in Grad kann nur von 0 bis 360 zum Beispiel variieren. Ich weiß nicht, wie dies mit der Kurvenanpassung Toolbox erreichen.Mehrere Variable nicht lineare Regression oder Kurvenanpassung Matlab

Ich habe auch andere Optionen wie nicht lineare Regression Techniken in MATLAB (fitnlm, lsqcurvefit etc) versucht, die enttäuschend erwies, wie ich kann über diese Variablen Grenzen haben. Trotz der guten Passform sind die Koeffizienten viel zu schlecht.

Also, Frage 1: Wie passe ich mehrere Variablen mit Kurvenanpassung? Frage 2: Wenn das nicht möglich ist, was andere Techniken kann ich außer nichtlineare Regression verwenden.

Viele Thnaks im Voraus! Ich wünsche ihnen einen wunderbaren Tag !

+1

Ihr Problem Konfigurieren Sie in 'cftool', bis Sie es richtig machen, dann die "Export-Code" Funktion verwenden, um zu lernen, wie es programmatisch zu tun. –

+0

@Sayantan Roy Hast du die Antwort versucht? Oder bitte klären Sie Ihre Frage – anquegi

+0

@anquegi Sorry für die späte Antwort. Ja, ich habe deine Antwort gesehen und danke für die Mühe. Mein Problem ist die Anpassung, die ich bekomme gibt einen seltsamen Alpha-Wert, der nur zwischen 0 und 360 sein kann. Ich habe Ihre Funktion verwendet und eine Grenze hinzugefügt. Die Anpassung erfüllt jedoch nicht meine Bedürfnisse. Ich denke, dass eine Datenmenge eine unterschiedliche Anzahl von Lösungen haben kann, da cos (theta) = cos (-theta) ist. So wie Matlab den Winkel Alpha berechnet, erzeugt es einen Wert, jedoch kann dieses Alpha auch ein anderer Wert sein, der die gleiche Gleichung und den gleichen Datensatz erfüllen würde. Ich weiß nicht, wie man multiple Werte für Alpha bekommt. –

Antwort

1

Nun, wenn ich Ihr Problem Sie haben eine Reihe von Daten, für die Variablen x1 und x2 und dre Ergebnis y, und Sie wollen es mit dieser Gleichung modellieren:

y = a + b * log10(x1 - cosd(alpha - x2)) % I suppose that dcos = cosd, I do not really known this functions 

Zuerst werde ich das schaffen die Daten für diese Werte:

function y = getting_data(x1,x2) 

a = 3; 
b = 5; 
alpha = 120; 

y = a + b * log10(x1 - cosd(alpha - x2)); 

Nun wollen wir eine de Datensätze

>> % generate the data sets 
>> x1 = 9 .* rand(1000,1) + 1; % random values [1,10] 
>> x2 = 360 .* rand(1000,1); % random values [0,360] 
>> y = getting_data(x1,x2); % the values for the function 

erstellen erzeugen Funktion, die Kurvenanpassung für Ihr Modell

function myfit = fitting_data(x1,x2,y) 

myfittype = fittype('a + b * log10(x1 - cosd(alpha - x2))',... 
    'dependent',{'y'},'independent',{'x1','x2'},... 
    'coefficients',{'a','b','alpha'}) 

myfit = fit([x1 x2],y,myfittype) 

vorsicht mit dem Eingangsvektor verwenden sollte es nx1 auf die Fit-Funktion

und schließlich erhalten wir die Koeffizienten sein:

>> fitting_data(x1,x2,y) 

myfittype = 

    General model: 
    myfittype(a,b,alpha,x1,x2) = a + b * log10(x1 - cosd(alpha - x2)) 
Warning: Start point not provided, choosing random start point. 
> In curvefit.attention.Warning/throw (line 30) 
    In fit>iFit (line 299) 
    In fit (line 108) 
    In fitting_data (line 7) 

    General model: 
    myfit(x1,x2) = a + b * log10(x1 - cosd(alpha - x2)) 
    Coefficients (with 95% confidence bounds): 
     a =   3 (3, 3) 
     b =   5 (5, 5) 
     alpha =   120 (120, 120) 


    General model: 
    ans(x1,x2) = a + b * log10(x1 - cosd(alpha - x2)) 
    Coefficients (with 95% confidence bounds): 
     a =   3 (3, 3) 
     b =   5 (5, 5) 
     alpha =   120 (120, 120) 

wich repräsentieren die Werte, die wir schätzen

Auch wird es nützlich sein, de con (A - B) wie folgt zu trennen:

trigonometic identities

und auch daran denken, dass

enter image description here