• 回答数

    0

  • 浏览数

    2278

  • 收藏数

    0

作者:地狱异类 发表于 2018-11-20 11:44:57
跳转到指定楼层
我用fsolve函数求解一个非线性方程组,但是我设置的每一个初始值都能求解出一个结果,但是当我把求出来的结果重新带入方程组后发现结果均不相等,即P2 不等于 x(2)(它们应该相等才是正确的。),最终的S,Pt,Pc均为0。请问各位大佬我可以怎么办?第一次发帖,如有错误请多包涵。下面这个是我运行的代码:
  • clear;
  • clc;
  • % parameter
  • payload = 125; %byte
  • slot_time = 9; %us
  • data_rate = 54; %Mbps
  • sigma = 1; %us
  • CW_min = 15;
  • CW_max = 1023;
  • difs = 28; %us
  • sifs = 10; %us
  • ACK = 112; %bit
  • phy_header = 20; %us
  • mac_header = 202; %bit
  • STT = 5;
  • n = 5;
  • m = 6;
  • Ts = (mac_header + payload * 8 + ACK)/(54000000) + (phy_header + sifs + difs + 2 * sigma) * 10^-6;
  • Tc = (mac_header + payload * 8 + ACK)/(54000000) + (phy_header + difs +  sigma) * 10^-6;
  • a=0.0001:0.0001:1;
  • p = 0;
  • S = 0;
  • index_max = 0;
  • Pt = 0;
  • Pc = 0;
  • j=1;
  • for i=1:length(a)
  •     % 这个是用来看一下吞吐量随着发射概率变化的曲线
  • x0 = [a(i) ; 0.6];  % Make a starting guess at the solution
  • options = optimoptions('fsolve','Display','iter'); % Option to display output
  • [x,fval,exitflag] = fsolve(@ECAfun,x0,options); % Call solver
  • P1 = x(1);
  • P2 = 1-(1-P1)^(n-1);
  •   if (P2 == x(2))
  •     Ptr=1-(1-x(1))^n;
  •     Ps=n*x(1)*(1-x(1))^(n-1)/Ptr;
  •     S(j)=(Ps*Ptr*payload)/( (1-Ptr)*sigma*10^-6 + Ptr*Ps*Ts + Ptr*(1-Ps)*Tc  )
  •     Pt(j) = x(1);
  •     Pc(j) = x(2);
  •     j=j+1;
  •   end
  • end

复制代码

这个是要求解的非线性方程组:

  •    function F = ECAfun(x)
  •    CW_min = 15;
  •    STT = 5;
  •    m = 6;
  •    n = 5;
  •    beta = x(2)/((1-x(2))^(STT+1));
  •    aa = 0;
  •    for i=1:m
  •        gama = (3*2^(i-1)-1)/(i+1);
  •        aa = aa + (beta^i)*gama;
  •    end
  •    b00 = 1/(  ( 1-(beta^(m+1)) ) /( 2*(1-beta) )   +  CW_min * (0.5 + aa)    );
  •    x(1) = ( ( 1-(beta^(m+1)) )/(1-beta) ) * b00;
  •    F1 = ( ( 1-(beta^(m+1)) )/(1-beta) ) * b00 - x(1);
  •    F2 = 1-(1-x(1))^(n-1) - x(2);
  •    F = [F1;F2];

复制代码



分享:
回复

使用道具

成为第一个回答人

高级模式 评论
您需要登录后才可以回帖 登录 | 立即注册 微信登录