如何在 MATLAB 中求解多个非线性和独立方程

How to solve multiple non-linear and independent equations in MATLAB

我有 16 个相互独立的非线性方程,即它们不是方程组。一种方法是创建 16 个单独的子例程并使用 fsolve 来解决我通常做的事情。 但我需要将子例程的数量从 16 个减少到一个。让我尝试举例说明我目前所做的事情:

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。但我不确定如何使用它以及在哪里使用它。

只需创建一个函数数组和初始猜测,如 documentation for fsolve 的第一个示例所示。

% 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 

您应该重写代码以使用 vectors/cell 数组,如下所示:

% 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 来提高效率,请参阅 了解更多信息。

自动构造 vector/cell 数组的技巧(已弃用)

为了完整起见,我应该提到您可以使用 eval:

自动初始化 u0polsim
for i=1:16
    eval(['u0(', num2str(i), ') = u0', num2str(i),';']);
    eval(['polsim{', num2str(i), '} = polsim', num2str(i),';']);
end

请注意,我不推荐这种方法。直接定义为vector/cell数组会好很多。