如何通过fsolve函数获得具有灵活参数的这些方程式的根?

时间:2019-08-13 10:52:37

标签: matlab

我编写了两个mfile来求解两个方程的根 t p 。方程中使用了一个灵活的参数 n ,它从1变为100。现在,代码只能将100次而不是1到100的根作为 n = 100来求解。 。如何纠正?

文件1:

function q=CSMA(x)
      m=5;
      W=32;

      p=x(1);
      t=x(2);

  for n = 1:100;

      q(1)=(1-2*p)*(1+W)+p*W*(1-(2*p)^m)-2*(1-2*p)/t;
      q(2)=(1-(1-t)^(n-1))-p;

  end
end

文件2:

N = 100;
the_roots = zeros(1, N);

for n = 1:N
    y = fsolve('CSMA', [0.1, 0.1], optimset('Display', 'off'));
    p = y(1);
    t = y(2);
    the_roots(n)= t;
end

figure;
plot(the_roots, 'b-');

1 个答案:

答案 0 :(得分:2)

您需要将变量n作为参数传递给函数。例如,您可以像这样更改CSMA函数:

function q=CSMA(x,n)
      m=5;
      W=32;

      p=x(1);
      t=x(2);

      q(1)=(1-2*p)*(1+W)+p*W*(1-(2*p)^m)-2*(1-2*p)/t;
      q(2)=(1-(1-t)^(n-1))-p;

end

然后使用函数句柄进行优化,如下所示:

N = 100;
the_roots = zeros(1, N);

for n = 1:N
    f = @(x) CSMA(x,n);
    y = fsolve(f, [0.1, 0.1], optimset('Display', 'off'));
    p = y(1);
    t = y(2);
    the_roots(n)= t;
end

figure;
plot(the_roots, 'b-');

绘制的输出如下所示:

Plotted output of roots