我用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];
复制代码
|
|