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])
上面的代码产生一个错误,'E'是一个未定义的函数或变量。然而,在所有集成(fun12,fun22和fun 32)中,我已经清楚地表明集成在变量E上,其中限制分别包含v1,v2和v3。 (所以E甚至不应该存在于最终的错误函数中)。
我是否在实施fminsearch功能时遇到了一些错误? 任何帮助将受到高度赞赏。
答案 0 :(得分:0)
它甚至无法达到最小搜索。问题在于整合。
看起来Matlab无法计算封闭形式(尽管错误并不是真正具有描述性)。
你可以通过这样做来重现这一点。
error = matlabFunction(error1)
error(4300, 3500, 32000)
一个缓慢的解决方法是手动替换,然后以数字方式计算您的解决方案:
vpa(subs(error1,[v1,v2,v3],[4300 3500 32000]))
瓶颈在于替代。我想有一些方法可以将vpa
和matlabFunction
结合起来,使所有这些更快,但我不知道。