2017-02-07 3 views
0

Ich versuche, eine Gleichung mit fzero in Matlab numerisch zu lösen. Es ist Teil einer größeren Übung. Ich habe nicht viel hier gepostet, also nicht sicher, wie viel Hintergrundinformationen Sie über diese Übung brauchen, also versuchen Sie es kurz zu halten.Numerische Lösung einer Gamma-Parameter-Schätzung

Dies ist mein Code:

fun = @(a)log(a/xBar) + (1/n) * log(dataProd) + diff(gamma(a))/gamma(a); 
x0 = 0.8014; 
x = fzero(fun,x0) 

Dies sind die Werte: n = 209 XBar ist 0,6078 dataProd = 3.1554e-77

ich die folgende Fehlermeldung in Matlab erhalten:

Operanden zum || und & & Operatoren müssen in logische skalare Werte umwandelbar sein.

Fehler in fzero (Linie 306)

elseif ~ isfinite (fx) || ~ isreal (fx)

Irgendeine Idee, warum ich diese Fehlermeldung bekomme?

+0

was ist 'diff' für dich? Weil 'diff' Unterschiede zwischen benachbarten Werten in einem Array berechnet. Der Unterschied zwischen Werten in einem 1-Wert-Array ist "inexistent" oder "[]", so dass "diff (gamma (a))" '[]' ist. Das macht 'fun (a)' return '[]' wenn 'a' ein einzelner Wert ist, scheitert dieses' fzero'. Eigentlich ist Ihr 'Spaß' nur für einzelne Werte definiert, also gibt es immer '[]' –

+1

Wenn das, was Sie mit dem 'diff' meinen, eine Ableitung der Gamma-Funktion ist, dann schauen Sie sich die Matlab-Funktion' psi' an. Sie können damit Ableitungen von Gamma berechnen. Aber da wir nicht wissen, was Sie versuchen, ist das nur eine Vermutung. – Florian

+0

Ich schaute auf diese Seite: https://se.mathworks.com/help/symbolic/differentiation.html. Deshalb dachte ich, Diff sei die Differenzierung einer Funktion. Was ich will, ist die Ableitung von Gamma am Punkt a geteilt durch Gamma. Ich denke, das ist, was Psi (a) ist. Ich änderte diff (gamma (a))/gamma (a) zu psi (a). Vielen Dank :) –

Antwort

0

Ich würde vermuten, dass während der Suche nach einer Lösung fzero versucht, Ihre Funktion bei a = 0 zu bewerten, was zu einer Unendlichkeit führt. Um zu überprüfen, ob dies der Fall ist, schauen Sie, ob Sie den Optimierungsparameter 'display' auf 'iter' oder etwas ähnliches in Ihrer Version von Matlab einstellen können. Andernfalls können Sie einfach Ihre Funktion in eine separate m-Datei verschieben und disp (a) in der ersten Zeile aufrufen. Auf diese Weise können Sie sehen, was fzero macht und welcher Wert von a das Problem verursacht.