我想在函数上应用循环。我有以下“母亲”代码:
v = 1;
fun = @root;
x0 = [0,0]
options = optimset('MaxFunEvals',100000,'MaxIter', 10000 );
x = fsolve(fun,x0, options)
另外,我在单独的文件中有以下功能:
function D = root(x)
v = 1;
D(1) = x(1) + x(2) + v - 2;
D(2) = x(1) - x(2) + v - 1.8;
end
现在,我希望在v = sort(rand(1,1000))
时找到根。换句话说,我想为v
的每个值迭代函数。
答案 0 :(得分:1)
您需要修改root
以接受其他变量(v
),然后将函数句柄更改为root到匿名函数,该函数以您想要的v
为基础进行输入< / p>
function D = root(x, v)
D(1) = x(1) + x(2) + v - 2;
D(2) = x(1) - x(2) + v - 1.8;
end
% Creates a function handle to root using a specific value of v
fun = @(x)root(x, v(k))
答案 1 :(得分:1)
如果等式是您的实际等式(而不是虚拟示例):该等式是线性,意味着,您可以为所有{{1使用简单的mldivide
:
v
而且,如果不你的实际方程,你不需要循环,你可以矢量化整个事物:
v = sort(rand(1,1000));
x = [1 1; 1 -1] \ bsxfun(@plus, -v, [2; 1.8])
这可能会或可能不会比循环更快,这取决于您的实际方程式。
它可能会慢一些,因为function x = solver()
options = optimset('Display' , 'off',...
'MaxFunEvals', 1e5,...
'MaxIter' , 1e4);
v = sort(rand(1, 1000));
x0 = repmat([0 0], numel(v), 1);
x = fsolve(@(x)root(x,v'), x0, options);
end
function D = root(x,v)
D = [x(:,1) + x(:,2) + v - 2
x(:,1) - x(:,2) + v - 1.8];
end
需要计算2000×2000(4M元素)的雅可比行列,而不是2×2,1000倍(4k元素)。
但是,它可能会更快,因为fsolve
的启动成本可能很大,这意味着许多调用的开销实际上可能超过计算较大雅可比行列式的成本。
在任何情况下,将雅可比行列式作为第二个输出都将极大地加速一切:
fsolve
答案 2 :(得分:0)
vvec = sort(rand(1,2));
x0 = [0,0];
for v = vvec,
fun = @(x) root(v, x);
options = optimset('MaxFunEvals',100000,'MaxIter', 10000 );
x = fsolve(fun, x0, options);
end
带有函数定义:
function D = root(v, x)
D(1) = x(1) + x(2) + v - 2;
D(2) = x(1) - x(2) + v - 1.8;
end