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

时间:2017-07-10 12:19:01

标签: matlab nonlinear-optimization

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

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.但是我不知道如何使用它以及在哪里使用它。

2 个答案:

答案 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自动初始化u0polsim

for i=1:16
    eval(['u0(', num2str(i), ') = u0', num2str(i),';']);
    eval(['polsim{', num2str(i), '} = polsim', num2str(i),';']);
end

请注意,我不推荐这种方法。将它们直接定义为矢量/单元阵列要好得多。