下面的代码试图根据此图中显示的等式绘制图形。初始参数在代码中给出。即使使用这个小代码,我也会遇到错误。我在哪里弄错了? F函数是指超几何函数。
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的答案编辑了代码。所做的修改已在代码中突出显示。但是,我似乎还没有得到它。
答案 0 :(得分:1)
我发现了两种错误:
您遗漏了运营商lambda_c(mu + 1)
应该lambda_c*(mu + 1)
这至少发生过两次。
似乎您正尝试使用3x1 p_d
和10x1 lambda_d
为Tplot
生成3条曲线。 Matlab矢量化并不是那样工作的。您应该使用for循环或使用2D数组执行智能(并且难以阅读)的操作。提示:使p_d
成为10x3阵列。
尝试
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)
linspace
并不完全正确。如果您需要类似于情节的内容,则需要执行:Tplot= linspace(-7.5, 10, 8);
或Tplot= -7.5:2.5:10;
。 hypergeom
函数在Tplot == 0
时导致问题。 Matlab抛出division by zero
错误。不过,我不确定这个函数在做什么。但我可以猜测,当T为0db时,函数的值介于0和1之间。hypergeom
v
的复数
简而言之,您需要检查 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;