我的求解过程分为两部分:1、求出方程表达式;2、求解方程。
求解方程表达式的代码:
V=sym('[2,2,2,3,3,3,4,4,4]');
T=sym('[651,496,1543,95,174,319,81,61,23]');
syms a n m;
ITA=(a./V).^n;
Lnf=-(T./ITA).^m+(m-1).*log(T./ITA)+log(m./ITA);
f=-sum(Lnf);
得到f 的表达式之后,利用第二部分的randwalk函数求解方程未知数。此时需要重新对f做出定义,即在命令窗口输入
f=@(a,n,m) 23^m*(2^(2*n)/a^n)^m - 3*log((3^n*m)/a^n) - 3*log((2^(2*n)*m)/a^n) - 3*log((2^n*m)/a^n) + 61^m*(2^(2*n)/a^n)^m - log((95*3^n)/a^n)*(m - 1) - log((319*3^n)/a^n)*(m - 1) - log((651*2^n)/a^n)*(m - 1) - log((1543*2^n)/a^n)*(m - 1) + 3^(4*m)*(2^(2*n)/a^n)^m - log((23*2^(2*n))/a^n)*(m - 1) - log((61*2^(2*n))/a^n)*(m - 1) - log((81*2^(2*n))/a^n)*(m - 1) - log((31*2^(n + 4))/a^n)*(m - 1) - log((58*3^(n + 1))/a^n)*(m - 1) + 95^m*(3^n/a^n)^m + 174^m*(3^n/a^n)^m + 319^m*(3^n/a^n)^m + 496^m*(2^n/a^n)^m + 651^m*(2^n/a^n)^m + 1543^m*(2^n/a^n)^m;%此表达式为第一部分求出
再在命令窗口输入:[ mx,minf ] = randwalk( f,[9.5,4,3],0.5,0.0001,1000,3)即可求出各未知数。其中randwalk.m的代码为:
function [ mx,minf ] = randwalk( f,x,lamda,epsilon,N,n)
F=zeros(n,1);
X=zeros(n,3);
f1=f(x(1),x(2),x(3));
while(lamda>=epsilon)
k=1;
while(k<=N)
u=unifrnd(-1,1,n,3);
for ii=1:n
X(ii,:)=x+lamda*(u(ii,:)/norm(u(ii,:)));
F(ii)=f(X(ii,1),X(ii,2),X(ii,3));
end
[f11,kk]=min(F);
if f11
f1=f11;
x=X(kk,:);
k=1;
else
k=k+1;
end
end
lamda=lamda/2;
end
mx=x;
minf=f1;
end
如果不加f=@(a,n,m)的话,randwalk无法知道要求解哪三个未知数,会出错。请问,我该如何把两部分变成一部分实现,即可以生成表达式后,不需要重新输入我的表达式是
f=@(a,n,m)......,而直接得到三个未知数的值呢?