无需工具箱:
在 MATLAB 中,您可以使用 fminsearch() 以数字方式执行此操作。
关键思想是将方程y = w重写为y - w = 0。然后,构造一个convex function 以保证返回的局部最小值确实是全局最优的,例如abs(y-w)。
% Rewrite equation y = w as y - w = 0.
% Then minimize abs(y-w).
fh =@(x,c) abs((x.^(0.22)).*(c*exp(-c*(x.^(0.22)))-1) - c*log(0.7657));
c = 267;
x0 = 5; % initial guess
[x, abserr] = fminsearch(@(x) fh(x,c),x0) % x = 264587674.0243530
请注意,abserr = 4.2633e-14 非常接近于零(平等)。
同样,您可以最小化误差平方和以获得相同的答案。
% minimize sum((y-w).^2)
gh =@(x,c) sum(((x.^(0.22)).*(c*exp(-c*(x.^(0.22)))-1) - c*log(0.7657)).^2);
[x, sse] = fminsearch(@(x) fh(x,c),x0)
而不是使用arrayfun(),为每个c 值获取不同的x 值,它可能更容易循环。
C = [100 267 300].';
Xval = zeros(size(C));
for ii = 1:length(C)
Xval(ii) = fminsearch(@(x) fh(x,C(ii)),x0);
end
不推荐:
虽然fzero() 也可以解决y - w = 0,但请注意它会中止搜索包含符号变化的区间(如果x 为负数)。因此,您要么必须以某种方式对该方向添加惩罚,要么尝试从不同的起始值。
% solve y-w==0
zh =@(x,c) (x.^(0.22)).*(c*exp(-c*(x.^(0.22)))-1) - c*log(0.7657)
使用相同的起点,
x = fzero(@(x) zh(x,c),x0)
返回错误
退出 fzero:中止搜索包含符号的区间
改变
因为在搜索过程中遇到了复杂的函数值。 (-1.4 处的函数值为 70.4499-0.686399i。)检查函数或尝试
再次使用不同的起始值。 x = NaN
同时
x = fzero(@(x) zh(x,c),2e8) % adjusted starting guess
工作得很好。
使用 MATLAB R2019a 测试