Что не так в этом коротком коде MATLAB? - PullRequest
0 голосов
/ 18 мая 2018

Приведенный ниже код пытается построить график на основе уравнений, показанных на этом рисунке. Начальные параметры приведены в коде. Я получаю ошибки даже с этим небольшим кодом. Где я ошибся? 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 голосов
/ 18 мая 2018
  1. Использование linspace не совсем правильно.Если вы хотите что-то похожее на сюжет, вам нужно сделать: Tplot= linspace(-7.5, 10, 8); или Tplot= -7.5:2.5:10;.
  2. Вы уверены, что вам нужно использовать значение Tplot как есть?Кажется, что T находится в дБ.
  3. Если опция-2 верна, то функция
    • hypergeom вызывает проблему при Tplot == 0.Matlab выдает ошибку division by zero.Я не уверен, что делает эта функция, хотя.Но я могу догадаться, что функция (и) имеет значение между 0 и 1, когда T равно 0 дБ.
    • Для всех -ve значений Tplot вы получите комплексные числа изhypergeom
    • Вы также получите комплексные числа для v, когда Tplot -ve
  4. As p_c и p_d зависят от v , вы получите комплексные числа, если v является сложным.

Короченеобходимо проверить значения T .И как только вы используете положительные значения T, я думаю, все станет на свои места.Конечно, вам нужно позаботиться о syntax при оценке таких выражений, как lambda_c(mu + 1).

EDIT

Вот правильная версия вашего кода:

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

0 голосов
/ 18 мая 2018

Я заметил два вида ошибок:

  1. вы не указали оператор lambda_c(mu + 1) должно быть lambda_c*(mu + 1) это произошло как минимум дважды.

  2. кажется, вы пытаетесь сгенерировать 3 кривые для p_d, используя 3x1 lambda_d с 10x1 Tplot.Matlab векторизация не работает таким образом.Вы должны либо использовать цикл for, либо делать что-то умное (и трудное для чтения) с двумерными массивами.Подсказка: сделайте p_d массив 10х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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...