MATLAB: ошибка при использовании fminsearch()

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? Любая помощь будет высоко оценена.

1 ответ

Решение

Это даже не достигает минимального поиска. Вопрос в интеграции.

Похоже, что Matlab не может вычислить замкнутую форму (хотя ошибка не является действительно описательной).

Вы можете воспроизвести это, просто делая.

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

Медленное решение состоит в том, чтобы вручную заменить, а затем численно вычислить ваше решение:

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

Узкое место в замене. Я думаю, что есть способ объединить vpa с matlabFunction чтобы сделать все это быстрее, но я не знаю об этом.

Другие вопросы по тегам