使用递归 MATLAB 函数或优化?
Use recursive MATLAB function or optimization?
我正在尝试确定最有效但最精确的方法来计算一个名为 R
的值,该值只能取 0
和 1
之间的值。现在我在下面的脚本中使用了下面的函数,但我觉得我正在以一种非最佳的方式来做这件事。目前我得到一个答案并且必须(再次)将该答案作为初始 "guess" 提供,以获得(下一个)最佳答案。我可以为此构建更好的递归还是使用 Matlab 的求解器之一?谢谢!
函数:
function f = Rfind(p,u,R)
f = p .* (R.^u);
end
脚本:
R = 0.999995753651217; % initial guess
matches = false;
while ~matches && R < 1
R = R + 0.0000000000000000001; % increment R for next guess
Jtotal = sum(Rfind(p,u,R)); % find R
if abs(Jtotal - R)*10000000000 < 5 % check precision of result
matches = true; % if R matches R fed to function, successful
end
end
Jtotal
我要识别的内容:
找到 R
的值等于数组 p
乘以 R
的总和的数组 u
次方。数组 p
和数组 u
都具有相同数量的元素,即每列 12 行。我的函数为每个 p
和 u
行计算 R
,然后增加其猜测以找到下一个最接近的匹配项。一旦达到精度限制或输入 R
和输出总数相同,它就会停止。
示例数据:
数组p
0.00000693
0.00000231
0.00001386
0.00000924
0.00041360
0.00461657
0.03085337
0.01595235
0.09614154
0.06832660
0.11103563
0.67262800
数组u
50000
500
50
25
10
7.5
5
3.5
2.5
1.25
1
0
重要:我需要最好的精度,但我不希望它像上面的扩展那样花费 10 分钟。
您可以使用 fminbnd
这样做:
% first assign p and u
% define the function that you want to minimize:
Rfind = @(R) abs(sum(p.*(R.^u)) - R)
% set the tolerance to maximum:
options = optimset('TolX',eps);
% find the value between 0 to 1 that minimize the function Rfind:
[R, err] = fminbnd(Rfind,0,1,options)
并得到(在几分之一秒内):
R =
0.999995761369809
err =
9.196743366857163e-11
我正在尝试确定最有效但最精确的方法来计算一个名为 R
的值,该值只能取 0
和 1
之间的值。现在我在下面的脚本中使用了下面的函数,但我觉得我正在以一种非最佳的方式来做这件事。目前我得到一个答案并且必须(再次)将该答案作为初始 "guess" 提供,以获得(下一个)最佳答案。我可以为此构建更好的递归还是使用 Matlab 的求解器之一?谢谢!
函数:
function f = Rfind(p,u,R)
f = p .* (R.^u);
end
脚本:
R = 0.999995753651217; % initial guess
matches = false;
while ~matches && R < 1
R = R + 0.0000000000000000001; % increment R for next guess
Jtotal = sum(Rfind(p,u,R)); % find R
if abs(Jtotal - R)*10000000000 < 5 % check precision of result
matches = true; % if R matches R fed to function, successful
end
end
Jtotal
我要识别的内容:
找到 R
的值等于数组 p
乘以 R
的总和的数组 u
次方。数组 p
和数组 u
都具有相同数量的元素,即每列 12 行。我的函数为每个 p
和 u
行计算 R
,然后增加其猜测以找到下一个最接近的匹配项。一旦达到精度限制或输入 R
和输出总数相同,它就会停止。
示例数据:
数组p
0.00000693
0.00000231
0.00001386
0.00000924
0.00041360
0.00461657
0.03085337
0.01595235
0.09614154
0.06832660
0.11103563
0.67262800
数组u
50000
500
50
25
10
7.5
5
3.5
2.5
1.25
1
0
重要:我需要最好的精度,但我不希望它像上面的扩展那样花费 10 分钟。
您可以使用 fminbnd
这样做:
% first assign p and u
% define the function that you want to minimize:
Rfind = @(R) abs(sum(p.*(R.^u)) - R)
% set the tolerance to maximum:
options = optimset('TolX',eps);
% find the value between 0 to 1 that minimize the function Rfind:
[R, err] = fminbnd(Rfind,0,1,options)
并得到(在几分之一秒内):
R =
0.999995761369809
err =
9.196743366857163e-11