forum.vnstele.com

Вітруальне навчальне середовище телекомунікацій - Форум підтримки
Сьогодні: 28 березня 2024, 11:42

Часовий пояс UTC + 2 годин [ DST ]




Створити нову тему Відповісти  [ 2 повідомлень ] 
Автор Повідомлення
ПовідомленняДодано: 23 березня 2012, 00:57 
Офлайн
Аватар користувача

З нами з: 19 січня 2012, 18:50
Повідомлення: 31
Звідки: Львів
Мабуть, в десятків студентів під час обчислення імовірності поступлення викликів за допомогою формули Пуассона виникали такі ситуації коли в результаті вони отримували нулі або результати типу NaN(not-a-number) або ще якісь некорректні результати. Це зумовлено недосконалістю використовуваного математичного апарату, а сама недосконалість полягає в тому, що більшість середовищ (MatCAD, MATLAB, Mathematica) коли в результаті виконання якоїсь функції (наприклад функції факторіалу і т.д.) отримують число більше якогось конкретного числа замініють його на значення inf(безмежність, доречі inf це уже символьна змінна), що в подальших обчисленнях приводить до незовсім бажаного результату. (подібне відбувається і з дуже маленькими числами які заміннюються нулем).
Що ж робити в таких ситуаціях?
Слід зробити так щоб программа рахувала не конкретну функцію(наприклад функції факторіалу і т.д.), а весь вираз загалом. Для цього досить часто використовують рекурентну формулу - формулу, що зводить обчислення n- го члена якої-небудь послідовності до обчислення декількох попередніх її членів.
Нижче, я наведу приклад функції яка обчислює формулу Пуассона за допомогою саме такого математичного апарату( функція ця написана в середовищі MATLAB):
Код:
function mass=Poisson(Y,k)
for K=0:k
    for kk=0:K
    if kk==0
        Pk=((Y^kk)*exp(-Y))/ factorial(kk);
    else
        Pk=(Pk*Y)/kk;
    end
    end
    mass(K+1)=Pk;
end
return

Ця функція повертає масив значень імовірності поступлення k викликів, причому елемент масиву з індексом k+1, відповідає імовірності посутплення k викликів (це зумовлено тим, що індексація елментів масиву в середовищі MATLAB починається не з нуля(як в С++), а з одиниці).

Як користуватись цією функцією? Дивіться тут!

Також, я запропоную алогритм для побудови графіка в середовищі MATLAB за допомогою ціє функції:
Код:
at=250/3600; % середня тривалість заняття викликом КС(годин);
N=717; %кількість джерел навантаження;
ac=4.1; %середня кількість викликів від одного джерела за одиницю часу;
k=N; K=0:k;
Y=at*ac*N;
mass=Poisson(Y,k);
graf=plot(K, mass);
set(graf,'lineWidth',2,'Color',[1 0 0]);

title('Графік залежності P(k)(розподіл Пуассона)');
xlabel('k, кількість викликів');
ylabel('P(k), імовірність поступлення k викликів');
grid on;

От власне і все. Дякую, якщо дочитали до кінця. :)

П.С. Якщо ви знайшли в цій функції якусь помилку, або можете запропонувати кращий варіант реалізації цієї функції, пропунуйте свої варіанти, оскільки ця тема призначена саме для цього.
П.П.С. Сподіваюсь викладений тут мною матеріал допоможе вам з виконанням курсової роботи. :D

_________________
Зображення


Востаннє редагувалось Mykola Sheremeta в 24 березня 2012, 01:56, всього редагувалось 1 раз.

Догори
 Профіль  
 
ПовідомленняДодано: 23 березня 2012, 15:13 
Офлайн
Адміністратор сайту

З нами з: 11 січня 2011, 15:00
Повідомлення: 181
Звідки: Львів
Вирішення аналогічної задачі аналогічним способом :D
Код:
% Функція для обчислення імовірності поступлення к викликів (розподіл
% Пуассона. Індекс масиву імовірностей зсунуто на 1, тому що матлаб не
% підтримує індексацію елементів масиву з нуля. (перший елемент масиву -
% для к=0 викликів.
% k - результат виконання функції, дані по осі абсцис (для побудови графіка)
% p - імовірність pk(Y), обчислена за формулою Пуассона
% lambda - інтенсивність поступлення викликів від групи абонентів за одиницю часу.
% t - середня тривалість виклику.
% max_k - Останнє значення К (по осі абсцис)

function [k p] = poissrec (lambda, t, max_k)
Y=lambda*t;
p(1,1)=exp(-Y);
k(1,1)=0;

if (max_k ~= 0)
    for c=1:max_k
        k(c+1, 1) = c;
        p(c+1, 1) = p(c,1)*Y/c;
    end
end
return;


Ну і виклик та перевірка правильності роботи функції:
Код:
% Тестування роботи функції обчислень розподілу Пуассона
% Синьою суцільною лінією - обчислення через рекурентну формулу, червоною
% зірочкою - обчислення безпосередньо за формулою Пуассона.

lambda=10;
t=2;
max_k=50;

[k p] = poissrec (lambda, t, max_k);

for c = 0 : max_k
    pt(c+1, 1) = exp(-lambda*t)*(lambda*t)^c/factorial(c);
end

f=figure;
plot (k, p);
hold on;
plot (k, pt, '*r');

Підписи по осях і сітку на графіку включаємо аналогічно, як в попередньому пості ...
Єдине обмеження по величині Y, це коли e^(-Y) перетворюється в нуль.
Приклад роботи - на рис.1.


Приєднані файли:
test.png
test.png [ 4.77 Кб | Переглянуто 4080 разів ]
Догори
 Профіль  
 
Відображати повідомлення за:  Сортувати за  
Створити нову тему Відповісти  [ 2 повідомлень ] 

Часовий пояс UTC + 2 годин [ DST ]


Хто зараз онлайн

Зараз переглядають цей форум: Немає зареєстрованих користувачів і 1 гість


Ви не можете створювати нові теми у цьому форумі
Ви не можете відповідати на теми у цьому форумі
Ви не можете редагувати ваші повідомлення у цьому форумі
Ви не можете видаляти ваші повідомлення у цьому форумі
Ви не можете додавати файли у цьому форумі

Знайти:
Вперед:  
cron
POWERED_BY
Український переклад © 2005-2010 Українська підтримка phpBB