如何在 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
:
自动初始化 u0
和 polsim
for i=1:16
eval(['u0(', num2str(i), ') = u0', num2str(i),';']);
eval(['polsim{', num2str(i), '} = polsim', num2str(i),';']);
end
请注意,我不推荐这种方法。直接定义为vector/cell数组会好很多。
我有 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
:
u0
和 polsim
for i=1:16
eval(['u0(', num2str(i), ') = u0', num2str(i),';']);
eval(['polsim{', num2str(i), '} = polsim', num2str(i),';']);
end
请注意,我不推荐这种方法。直接定义为vector/cell数组会好很多。