首页 > 解决方案 > 索引超过数组元素的数量 (1)

问题描述

我尝试使用 matlab 来求解具有可变参数的多项式。我正在使用 fsolve。代码如下:

function my_fsolve3()
% Constant Parameters
A       = 6.24;
B       = 5.68e-5;
C       = 1.7e-3;
D       = 6.55e-8;
E       = 5.3e-8;
F       = 9.46e-1;

t       = [0;600;1200;1800;2400;3000;10200;17400;24600;31800;...
        39000;46200;53400;60600;67800;75000;82200;89400;96600;103800;...
        111000;118200;125400;132600;139800;147000;154200;161400;168600;175800;183000];

G       = [0.00;4.88E-06;4.88E-06;5.11E-06;5.11E-06;5.35E-06;5.35E-06;5.36E-06;5.36E-06;5.07E-06;....
        5.07E-06;4.93E-06;5.30E-06;5.30E-06;5.30E-06;9.46E-06;9.46E-06;1.13E-05;1.15E-05;1.10E-05;...
        1.10E-05;1.04E-05;1.04E-05;1.04E-05;1.03E-05;1.04E-05;1.06E-05;1.13E-05;1.13E-05;1.13E-05;1.03E-05];

H     = [0.00;3.34E-01;6.79E-01;1.04E+00;1.41E+00;6.00E+00;1.07E+01;1.56E+01;2.07E+01;2.59E+01;...
        3.14E+01;3.67E+01;4.18E+01;4.66E+01;5.09E+01;5.51E+01;5.90E+01;6.23E+01;6.56E+01;6.87E+01;...
        7.12E+01;7.36E+01;7.59E+01;7.78E+01;7.95E+01;8.11E+01;8.24E+01;8.24E+01;8.23E+01;8.21E+01;8.20E+01];

I     = [0.00;4.88E-06;4.88E-06;5.11E-06;5.11E-06;5.35E-06;5.35E-06;5.36E-06;5.36E-06;5.07E-06;...
        5.07E-06;4.93E-06;5.30E-06;5.30E-06;5.30E-06;9.46E-06;9.46E-06;1.13E-05;1.15E-05;1.10E-05;...
        1.10E-05;1.04E-05;1.04E-05;1.04E-05;1.03E-05;1.04E-05;1.06E-05;1.13E-05;1.13E-05;1.13E-05;1.03E-05];

J       = [1.78E-07;7.41E-06;9.33E-06;1.20E-05;1.05E-05;1.74E-05;3.72E-05;3.55E-05;1.00E-04;4.07E-02;...
        2.45E-01;6.17E-01;1.32E+00;2.29E+00;2.34E+00;2.40E+00;1.82E+00;1.38E+00;2.09E+00;1.82E+00;...
        1.58E+00;2.29E+00;1.62E+00;1.12E+00;8.91E-01;8.51E-01;7.59E-01;8.71E-01;1.12E+00;1.00E+00;8.51E-01];

K      = [9.75;8.13;8.03;7.92;7.98;7.76;7.43;7.45;7.00;4.39;...
        3.61;3.21;2.88;2.64;2.63;2.62;2.74;2.86;2.68;2.74;...
        2.8;2.64;2.79;2.95;3.05;3.07;3.12;3.06;2.95;3.00;3.07];

for i = 1:length(t)

    s(i)    = fsolve(@(x) x(i) + 2.* G(i) - ((H(i).* A.*x(i))/(x(i).^2 + A.*x(i) + A.*B))- 2.*((H(i).*A.*B)/(x(i).^2 ...
            + A.*x(i) + A.*B))-((I(i).*C.*x(i))/(x(i).^2 + C.*x(i) + C.*D))- 2.*((I(i).*C.*D)/(x(i).^2 ...
            + C.*x(i) + C.*D))- E/x(i), F);

end
L = 6 - log10(s);   
plot(t,L)
hold on
plot (t,K,'v')
xlabel('Time (sec)')
ylabel('pH')
hold off
legend('pH-Mod','pH-Exp')
end

我不知道如何才能确保索引值不超过数组元素的数量。在第 34 行,我索引到了自变量的末尾,认为这样可以防止错误。错误信息是

索引超过数组元素的数量 (1)。

Error in
my_fsolve3>@(x)x(i)+2.*G(i)-((H(i).*A.*x(i))/(x(i).^2+A.*x(i)+A.*B))-2.*((H(i).*A.*B)/(x(i).^2+A.*x(i)+A.*B))-((I(i).*C.*x(i))/(x(i).^2+C.*x(i)+C.*D))-2.*((I(i).*C.*D)/(x(i).^2+C.*x(i)+C.*D))-E/x(i)
(line 36)
    s(i)    = fsolve(@(x) x(i) + 2.* G(i) - ((H(i).* A.*x(i))/(x(i).^2 + A.*x(i) + A.*B))- 2.*((H(i).*A.*B)/(x(i).^2 ...

Error in fsolve (line 242)
            fuser = feval(funfcn{3},x,varargin{:});

Error in my_fsolve3 (line 36)
    s(i)    = fsolve(@(x) x(i) + 2.* G(i) - ((H(i).* A.*x(i))/(x(i).^2 + A.*x(i) + A.*B))- 2.*((H(i).*A.*B)/(x(i).^2 ...

Caused by:
    Failure in initial objective function evaluation. FSOLVE cannot continue.

标签: indexing

解决方案


您的匿名函数将 x 作为参数初始化为标量 F。您尝试访问 x(i),因为 x 是标量,所以 i>1 失败。解决方案:将 x(i) 替换为 x。

s(i)    = fsolve(@(x) x + 2.* G(i) - ((H(i).* A.*x)/(x.^2 + A.*x + A.*B))- 2.*((H(i).*A.*B)/(x.^2 ...
        + A.*x + A.*B))-((I(i).*C.*x)/(x.^2 + C.*x + C.*D))- 2.*((I(i).*C.*D)/(x.^2 ...
        + C.*x + C.*D))- E/x, F);

顺便说一句,标量乘法中不需要点运算符,只需在代码中使用一个简单的 * 即可。


推荐阅读