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])
上記のコードは、 'E'が未定義の関数または変数であるというエラーを生成します。しかし、すべての積分(fun12、fun22、fun32)の間、積分が変数Eを超えており、それぞれv1、v2、v3の制限があることを明確に示しました。 (したがって、最終的なエラー関数にEが存在してはいけません)。MATLAB:fminsearch()を使用したエラー
fminsearch関数の実装に間違いがありますか? ご協力いただければ幸いです。
vpa関数を使用すると、特定の[v1、v2、v3]値でエラーの値がわかります。しかし、私の目的はこれらの変数自体に対してerror1関数を最適化することであり、fminsearchには最適化を行うための関数ハンドルが必要なので、どうすればよいのでしょうか? [v1、v2、v3]のランダムな値を入力し続けるだけで、どのエラーが最小限のエラーであるかを確認することはできません。 –
'fminsearch(@(X)vpa(subs)(エラー1、[v1、v2、v3]、X))、[4300 3500 32000]))異なるシードで何回か実行して、極小で – xvan
私のシステムが遅いのかどうかは分かりませんが、結果を出すにはひどい時間がかかります(コードはあなたの最後のコメントから実行されていて、解決策はまだありません)。 私はせっかちなのですか、それとも起こるはずですか? –