【问题标题】:Solve One Equation Multiple times多次求解一个方程
【发布时间】:2017-08-11 15:33:09
【问题描述】:

我有 50 个观察值作为具有变量值的行和列。对于每个观察,我使用fsolve 来求解未知变量q_iz。我正在尝试使用循环。我已经为第 1st 行解决了它,但是当它转到第 2nd 行时,MATLAB 会抛出一个错误。另外,我想将k 的求解值存储在(50,1) 维度中。

我提出了一个更简单的代码来表示这个问题,如下所示:

 global price gnw dataq_izc(c) c

price = ones(50,2);
gnw = ones(50,2,2);
dataq_izc = 0.20*ones(50,1);

k0 = 0.1+ zeros(50,1);
for c = 1:50
options=optimset('Display','notify','MaxFunEvals',10^7,'TolX',1e-8,'TolFun',1e-6,'MaxIter',10^5);
% Solve 
k = fzero(@qiz,k0(c,1),options);
fprintf('Quantity\n');
disp(k);
end;

脚本'qiz'是:

function F = qiz(k)

global price gnw dataq_izc(c) c

q_iz = zeros(50,2,2);
i = 1.;
while i < 3
    z = 1.;
    while z < 3
    q_iz(c,i,z) = k(c,1)*price(c,z)/gnw(c,i,z);
    z = z + 1.;
    end
i = i + 1.;
end;

q_izc = zeros(50);
c = 1.;
while c < 51;
i = 1.;
while i < 3
    z = 1.;
    while z < 3
    q_izc(c) = q_izc(c)  + q_iz(c,i,z);
    z = z + 1.;
    end
i = i + 1.;
end;
c = c + 1.;
end

F = q_izc(c) - dataq_izc(c,1);

当我运行此代码时,第一行已解决,但当它转到第二行时会抛出错误:

FZERO 无法继续,因为用户提供了 function_handle ==> qiz 失败并出现以下错误。试图访问 k(2,1);索引出 界限因为 numel(k)=1。

【问题讨论】:

  • 你能发布一些全局变量的示例数据吗?
  • 语句'global'的目的是调用'main'文件中的参数到脚本'qiz'。所以全球............也将在“主”文件中......这是你要问的吗?
  • 否;例如,我们不知道price 的值,因此我们实际上无法运行此代码来重现问题。您能否发布一些示例数据,以便我们复制粘贴并运行?
  • 我已经输入了全局变量的值。如果现在可以告诉我
  • 错误是因为您在调用fzero 时将k0(c,1) 传递给函数qiz。这是k0 向量的单个值。在函数qiz 中,您要求输入第 c 个条目。只有1个条目。删除该函数中对k(c... 的所有引用。

标签: matlab for-loop linear-equation


【解决方案1】:

您已将标量 k0(c,1) 传递给您的函数 qiz。在该函数中,您尝试访问 k(c,1) 并得到错误说明。

FZERO 无法继续,因为用户提供的 function_handle ==> qiz 失败并出现以下错误。试图访问 k(2,1);索引超出范围,因为 numel(k)=1。

错误告诉您knumel(k)=1 的标量。这是第一个错误。第二个是在函数qiz 中重新分配c 的值。您将c 定义为global,然后将其用作第二个循环中的索引。当qiz 结束时,c 的值现在是 51。这超出了k0 向量的范围。尝试始终使用有意义的变量名来避免此错误。

这是一个工作(无错误)版本。

function k = Test(  )

global c price gnw dataq_izc

price = ones(50,2);
gnw = ones(50,2,2);
dataq_izc = 0.20*ones(50,1);

k0 = 0.1+ zeros(50,1);
k = size(k0);
for c = 1:50
options=optimset('Display','notify','MaxFunEvals',10^7,'TolX',1e-8,'TolFun',1e-6,'MaxIter',10^5);
% Solve 
k(c) = fzero(@qiz,k0(c),options);
fprintf('Quantity: %f\n', k(c));
end

end


function F = qiz(k)

global c price gnw dataq_izc

q_iz = zeros(50,2,2);
i = 1.;
while i < 3
    z = 1.;
    while z < 3
        q_iz(c,i,z) = k*price(c,z)/gnw(c,i,z);
        z = z + 1.;
    end
    i = i + 1.;
end;

q_izc = zeros(50);
c2 = 1.;
while c2 < 51;
    i = 1.;
    while i < 3
        z = 1.;
        while z < 3
            q_izc(c2) = q_izc(c2) + q_iz(c2,i,z);
            z = z + 1.;
        end
        i = i + 1.;
    end;
    c2 = c2 + 1.;
end

F = q_izc(c) - dataq_izc(c,1);

end

【讨论】:

    猜你喜欢
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多