2016-04-06 24 views
0
clc; clearvars; clear all; 
syms T; syms E; syms v1; syms v2; syms v3; 
assume(v1>0 & v1<50000); 
assume(v2>0 & v2<50000); 
assume(v3>0 & v3<60000); 
b = 10/60; 
fun = int(exp(-E/(8.314*T)),T,300,T); 
s1 = 175.6 * 10^3; 
fun11 = (1/(v1*sqrt(2*pi)))* exp(- ((E-s1)^2)/(2*v1^2)); 
a1 = 10^14.52; 
fun12 = int(exp((-a1/b)*fun)*fun11,E,s1-3*v1,s1+3*v1); 
alpha1 = 1 - fun12; 
s2 = 185.4 * 10^3; 
fun21 = (1/(v2*sqrt(2*pi)))* exp(- ((E-s2)^2)/(2*v2^2)); 
a2 = 10^13.64; 
fun22 = int(exp((-a2/b)*fun)*fun21,E,s2-3*v2,s2+3*v2); 
alpha2 = 1 - fun22; 
s3 = 195.4 * 10^3; 
fun31 = (1/(v3*sqrt(2*pi)))* exp(- ((E-s3)^2)/(2*v3^2)); 
a3 = 10^13.98; 
fun32 = int(exp((-a3/b)*fun)*fun31,E,s3-3*v3,s3+3*v3); 
alpha3 = 1 - fun32; 
alpha = (alpha1 + alpha2 + alpha3)/3 
alphaexp=[0.01134 0.04317];% 0.06494 0.08783 0.17053 0.32533 0.49142 0.55575 0.59242 0.6367 0.678 0.71621 0.75124 0.78442 0.81727]; 
T = [350 400]; %T = [350:50:1050]; 
minfunc = (subs(alpha)-alphaexp).^2 
error1 = sum(minfunc) 
error = matlabFunction(error1) 
[xfinal,fval] = fminsearch(@(x)error(x(1),x(2),x(3)),[4300 3500 32000]) 

Der obige Code erzeugt einen Fehler, dass "E" eine undefinierte Funktion oder Variable ist. Jedoch habe ich während aller Integrationen (fun12, fun22 und fun32) klar angedeutet, dass die Integration über der Variablen E liegt, mit Grenzen, die v1, v2 bzw. v3 enthalten. (Also sollte E nicht einmal in der finalen Fehlerfunktion existieren).MATLAB: Fehler bei der Verwendung von fminsearch()

Mache ich einen Fehler bei der Implementierung der Funktion fminsearch? Jede Hilfe wird sehr geschätzt.

Antwort

0

Es erreicht nicht einmal die Min-Suche. Das Problem betrifft die Integrationen.

Sieht aus wie Matlab kann eine geschlossene Form nicht berechnen (obwohl der Fehler nicht wirklich beschreibend ist).

Sie können dies reproduzieren, indem Sie einfach tun.

error = matlabFunction(error1) 
error(4300, 3500, 32000) 

Eine langsame Arbeit ist rund um manuell ersetzen dann Ihre Lösung numerisch berechnen:

vpa(subs(error1,[v1,v2,v3],[4300 3500 32000])) 

Der Engpass in der Substitution ist. Ich denke, es gibt eine Möglichkeit, vpa mit matlabFunction zu kombinieren, um all das schneller zu machen, aber ich weiß es nicht.

+0

Ich verstehe, dass die Verwendung der vpa-Funktion mir den Wert des Fehlers bei einem bestimmten Wert [v1, v2, v3] gibt. Da mein Ziel jedoch darin besteht, die error1-Funktion für diese Variablen selbst zu optimieren, und fminsearch eine Funktion benötigt, um die Optimierung durchzuführen, verstehe ich nicht, wie ich das mache? Ich kann nicht einfach weiter zufällige Werte von [v1, v2, v3] eingeben, um zu sehen, was den minimalen Fehler ergibt. –

+0

'fminsearch (@ (X) vpa (Subs (Fehler1, [v1, v2, v3], X)), [4300 3500 32000]))' Führen Sie es ein paar Mal mit verschiedenen Samen, um sicherzustellen, dass Sie nicht sind auf einem lokalen Minimum. – xvan

+0

Ich bin mir nicht sicher, ob mein System langsam ist, aber es braucht sehr viel Zeit, um Ergebnisse zu erzielen (Der Code läuft seit dem letzten Kommentar und hat noch keine Lösung gefunden). Bin ich ungeduldig oder soll es passieren? –

Verwandte Themen