u01 = .001;....u016 = .001;
options=optimset('Display','notify','MaxFunEvals',10^7,'TolX',1e-,'TolFun',1e-6,'MaxIter',10^5);
u1 = fsolve(@polsim1,u01,options);
..
..
u16 = fsolve(@polsim16,u016,options);
因此,在上面的例子中,我有16个子程序,即polsim1-polsim16,其中每个子程序包括1个非线性方程来求解u。这种方法非常麻烦和杂乱。我需要在一个子程序中执行此操作。我相信我需要使用索引n = 1到16.但是我不知道如何使用它以及在哪里使用它。
答案 0 :(得分:2)
只需创建一系列函数和初始猜测,如fsolve
的{{3}}的第一个示例所示。
% Array of equations, nx1 in size for n equations.
% Ensure that the input (x) is indexed in each equation, e.g. x(1) in eqn 1
polsim = @(x) [x(1).^2 - 1
2*x(2) + 3];
% Array of initial guesses, corresponding element-wise to eqn array
u0 = [0.01; 0.01];
% Solver options
options = optimset('Display','notify','MaxFunEvals',10^7,'TolX',1e-5,'TolFun',1e-6,'MaxIter',10^5);
% Solve
u = fsolve(F, u0, options);
>> u = [1.000; -1.500] % As expected for the equations in F and intial guesses
答案 1 :(得分:0)
您应该重写代码以使用矢量/单元数组,如下所示:
% Write the initial point as a vector
u0(1) = .001;
..
u0(16) = .001;
% Write the equations as a cell array
polsim{1} = @polsim1;
..
polsim{16} = @polsim16;
options=optimset('Display','notify','MaxFunEvals',10^7,'TolX',1e-1,'TolFun',1e-6,'MaxIter',10^5);
u = zeros(u0); % Allocate output space for efficiency
% loop over all the equations
for i=1:length(u0)
u(i) = fzero(polsim{i},u0(i),options);
end
请注意,我使用fzero
代替fsolve
来提高效率,有关详细信息,请参阅this post。
欺骗自动构建向量/单元格数组(已弃用)
为了完整起见,我应该提一下,您可以使用eval
自动初始化u0
和polsim
:
for i=1:16
eval(['u0(', num2str(i), ') = u0', num2str(i),';']);
eval(['polsim{', num2str(i), '} = polsim', num2str(i),';']);
end
请注意,我不推荐这种方法。将它们直接定义为矢量/单元阵列要好得多。