这个简短的MATLAB代码有什么问题?

时间:2018-05-18 04:25:48

标签: matlab

下面的代码试图根据此图中显示的等式绘制图形。初始参数在代码中给出。即使使用这个小代码,我也会遇到错误。我在哪里弄错了? F函数是指超几何函数。

enter image description here

alpha = 4;
delta = 2/alpha;
P_c = 1;% 
P_d = 1;
T = 1;
%Tplot= linspace(-7.5, 10, 2.5); %referring to T % on the x-axis
Tplot=10^(-7.5/10):10^(2.5/10):10^(10/10); based on @Nakini answer
lambda_c = 0.01;
lambda_d = [0.002,0.01, 0.05]; 
mu = (delta/(1-delta)).*Tplot.* hypergeom([1, 1-delta], 2-delta, -Tplot);
v = (Tplot.^delta).*gamma(1-delta).*gamma(1+delta);
for k = 1:3 % from Dr Core's Edit
p_d(:,k) = lambda_d(k)./((lambda_d(k) .* (v + 1) + lambda_c.*(P_c/P_d).^delta).*v);
p_c(k,:) =  lambda_c./((lambda_c*(mu + 1) + lambda_d(k).*P_d/P_c).^delta).*v);
end
plot (Tplot, p_c);
hold on
plot (Tplot, p_d);

编辑:我根据@Doctor Core和@Nakini的答案编辑了代码。所做的修改已在代码中突出显示。但是,我似乎还没有得到它。

2 个答案:

答案 0 :(得分:1)

我发现了两种错误:

  1. 您遗漏了运营商lambda_c(mu + 1)应该lambda_c*(mu + 1)这至少发生过两次。

  2. 似乎您正尝试使用3x1 p_d和10x1 lambda_dTplot生成3条曲线。 Matlab矢量化并不是那样工作的。您应该使用for循环或使用2D数组执行智能(并且难以阅读)的操作。提示:使p_d成为10x3阵列。

  3. 尝试

    for k = 1:3
        p_d(:,k) = lambda_d(k)./((lambda_d(k) .* (v + 1) + lambda_c.*(P_c/P_d).^delta).*v);
    end
    

答案 1 :(得分:1)

  1. 使用linspace并不完全正确。如果您需要类似于情节的内容,则需要执行:Tplot= linspace(-7.5, 10, 8);Tplot= -7.5:2.5:10;
  2. 您确定需要使用 Tplot 的值吗?好像T在db中。
  3. 如果选项-2正确,那么
    • hypergeom函数在Tplot == 0时导致问题。 Matlab抛出division by zero错误。不过,我不确定这个函数在做什么。但我可以猜测,当T为0db时,函数的值介于0和1之间。
    • 对于Tplot的所有 -ve 值,您将从hypergeom
    • 获取复数
    • 当Tplot -ve
    • 时,您还会获得v的复数
  4. 由于 p_c p_d 依赖于 v ,只要 v ,就会得到复数复杂。
  5. 简而言之,您需要检查 T 的值。一旦你使用T的正值,一切都将落实到位,我猜。当然,在评估像syntax这样的表达式时,您需要注意lambda_c(mu + 1)

    修改

    以下是您的代码的正确版本:

    alpha = 4;
    delta = 2/alpha;
    P_c = 1;% 
    P_d = 1;
    T = -10:2.5:10;
    %Tplot= linspace(-7.5, 10, 2.5); %referring to T % on the x-axis
    % Tplot=10^(-7.5/10):10^(2.5/10):10^(10/10); %based on @Nakini answer
    Tplot=db2pow(T); %based on @Nakini answer
    lambda_c = 0.01;
    lambda_d = [0.002,0.01, 0.05]; 
    mu = (delta/(1-delta)).*Tplot.* hypergeom([1, 1-delta], 2-delta, -Tplot);
    v = (Tplot.^delta).*gamma(1-delta).*gamma(1+delta);
    col = ['-og'; '-or'; '-ob'];
    figure;hold on; grid on;
    for k = 1:3 % from Dr Core's Edit
        p_c =  lambda_c./(lambda_c*(mu + 1) + (lambda_d(k).*(P_d/P_c).^delta).*v);
        p_d = lambda_d(k)./(lambda_d(k) .* (v + 1) + lambda_c.*(P_c/P_d).^delta.*v);
        plot (T, p_c, col(k, :), 'MarkerFaceColor', col(k,3));
        plot (T, p_d, col(k, :), 'MarkerFaceColor', col(k,3));
    end
    set(gca, 'XTick',T);
    xlabel('T(db)')
    hold off;
    

    输出是: Output