Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Учебное пособие по МПП

.pdf
Скачиваний:
71
Добавлен:
21.03.2015
Размер:
2.61 Mб
Скачать

IF b$ = "n" OR b$ = "N" THEN END

INPUT "Введите число делений оси X:-"; px(4) INPUT "Введите число делений оси Y:-"; py(4) PRINT "Введите миним. и макс. значения аргумента "; INPUT "XMIN, XMAX"; px(6), px(7)

PRINT "Введите миним. и максим. значен. функции "; INPUT "YMIN, YMAX"; py(6), py(7)

px(5) = px(4) + 1!: px(1) = 84!: px(2) = 564!:

px(3) = px(2) - px(1): px(8) = px(7) - px(6): px(9) = px(8) / px(4): px(10) = px(3) / px(8): py(5) = py(4) + 1!: py(1) = 20!: py(2) = 180!: py(3) = py(2) - py(1): py(8) = py(7) - py(6): py(9) = py(8) / py(4): py(10) = py(3) / py(8)

10 : INPUT "Введите код вида графики (или 1 или 2 или 3)"; k SELECT CASE k

CASE 1: CLS : SCREEN 2: KEY OFF: marker = 2 FOR i = 1! TO py(5):

y = py(1) + py(3) / py(4) * (i - 1)

LINE (px(1) - 10!, y)-(px(2) + 10!, y): NEXT i

FOR i = 1! TO px(5): x = px(1) + px(3) / px(4) * (i - 1) LINE (x, py(1) - 8!)-(x, py(2) + 8!): NEXT i

CASE 2: CLS : SCREEN 2: KEY OFF: marker = 3

LINE (px(1), py(1))-(px(2), py(2)), , B: PRINT

FOR y = py(1) TO py(2) STEP py(3) / py(4)

LINE (px(1), y)-(px(1) + 3!, y)

LINE (px(2), y)-(px(2) - 3!, y): NEXT y

FOR x = px(1) TO px(2) STEP px(3) / px(4)

LINE (x, py(2))-(x, py(2) - 3!)

LINE (x + 1!, py(2))-(x + 1!, py(2) - 3!)

LINE (x, py(1))-(x, py(1) + 3!)

LINE (x + 1!, py(1))-(x + 1!, py(1) + 3!): NEXT x

CASE 3: CLS : SCREEN 2: KEY OFF: marker = 4 FOR i = 1 TO py(5): y = py(1) + py(3) / py(4) * (i - 1) LINE (px(1) - 8!, y)-(px(1) + 6!, y): NEXT i

FOR i = 1! TO px(5): x = px(1) + px(3) / px(4) * (i - 1) LINE (x, py(2) - 4!)-(x, py(2) + 4!): NEXT i

221

LINE (px(1), py(1) - 8!)-(px(1), py(2) + 8!)

LINE (px(1), py(2))-(px(2) + 4!, py(2))

CASE IS > 3: CLS : END

END SELECT

PRINT TAB(20); "Масштаб dX="; px(9); ";dY="; py(9) r = 23!: FOR k = 0! TO py(4): LOCATE r, 3

PRINT USING "#.##"; py(6) + py(9) * k: r = r - 20! / py(4): NEXT k

c = 7!: FOR k = 0 TO px(4): LOCATE 24, c PRINT USING "####.##"; px(6) + px(9) * k; c = c + 60! / (px(4) + 0!): NEXT k

FOR ix = px(1) TO px(2): xu = px(6) + (ix - px(1)) / px(10) CALL k3(h, xu, yu, v(), a(), b(), z())

iy = py(2) - (yu - py(6)) * py(10)

IF iy >= py(1) AND iy <= py(2) THEN

IF ix = px(1) THEN PSET (ix, iy) ELSE LINE -(ix, iy) END IF

NEXT ix

FOR ie = 1! TO j: ye = py(2) - (ye(ie) - py(6)) * py(10) IF ye >= py(1) AND ye <= py(2) THEN

xe = px(10) * (xe(ie) - px(6)) + px(1): PSET (xe, ye)

SELECT CASE marker

CASE 1: DRAW "U2 D4 U2 L4 R8 L4" CASE 2: DRAW "E2 L4 F4 L4 E3"

CASE 3: DRAW "E2 D4 H4 D4 E2 L4 R8 L4" CASE 4: DRAW "E2 G4 E2 H2 F4 H2 L4 R8 L4" CASE 5: DRAW "U2 G3 R6 H3 D2"

END SELECT END IF

NEXT: a$ = INPUT$(1)

CLS : INPUT "Сменить вид графика (y/n)"; f$

IF f$ = "y" OR f$ = "Y" THEN 10 ELSE CLS : END END SUB

222

SUB ppx (x, z(), v())

z(1) = x / v(1): z(2) = z(1) * z(1): z(3) = EXP(z(1))

z(4) = LOG(ABS(z(1))): z(5) = v(2) / x: z(6) = z(5) * z(5)

z(7) = z(5) * z(6): z(15) = LOG(x) / LOG(v(1)): z(16) = x - v(3) END SUB

SUB ppy (y, z(), v())

z(8) = y / v(3): z(9) = z(8) * z(8): z(10) = EXP(z(8))

z(11) = LOG(ABS(z(8))): z(12) = v(4) / y: z(13) = z(12) * z(12) z(14) = z(12) * z(13)

END SUB

SUB sort (n, u(), s())

'- Ранжировка по величине Коэффициента Парной Корреляции - PRINT STRING$(80, 46); "Код"; TAB(20); "КПК"; STRING$(80, 46) FOR k = 1! TO n: q = u(k): s = s(k)

FOR m = 1! TO n

IF u(m) <= q THEN q = u(m): s = m NEXT m

PRINT s, u(s): u(s) = 2! NEXT k

END SUB

Приложение 4 ‘Программа обработки опытных данных показательным законом

DECLARE FUNCTION Up! (P!) DECLARE SUB sort (n!, x!())

OPEN "OBPABOT.DAT" FOR OUTPUT AS #1

CLS : PRINT #1, "ОБРАБОТКА ОПЫТНЫХ ДАННЫХ ЭКСПОНЕНЦИАЛЬНЫМ ЗАКОНОМ РАСПРЕДЕЛЕНИЯ"

PRINT #1, STRING$(80, 46) INPUT "Тестировать"; a$

IF a$ = "n" OR a$ = "n" THEN

INPUT "Введите число замеров N="; n: DIM a(n)

FOR i = 1 TO n: PRINT "Введите значения A("; i; ")="; : INPUT a(i): NEXT

223

INPUT "Введите значение вероятности"; pp

ELSE

READ n: DIM a(n)

FOR i = 1 TO n: READ a(i): NEXT

READ pp

END IF

'......................................................................

PRINT #1, TAB(20); "ИСХОДНЫЕ ДАННЫЕ" PRINT #1, "Количество чисел массива N="; n PRINT #1, : PRINT #1, "Массив чисел"

FOR j = 0 TO n STEP 10: k = 0: WHILE k <= 9 AND w < n: k = k + 1! w = j + k: PRINT #1, a(w); : WEND: PRINT #1,

NEXT j

PRINT #1, "Вероятность p="; pp: PRINT #1, STRING$(80, 46) PRINT #1, TAB(40); "РЕЗУЛЬТАТЫ РАСЧЕТА": PRINT #1, u = Up(pp): PRINT #1, "Квантиль вероятности U("; pp; ")="; u 'ОСНОВНЫЕ ХАРАКТЕРИСТИКИ МАССИВА ЧИСЕЛ 'Вычисление среднего арифм. и среднеквадр. значений

t = 0: FOR i = 1 TO n: t = t + a(i): NEXT: c = t / n

s = 0: FOR i = 1 TO n: s = s + (a(i) - c) * (a(i) - c): NEXT s1 = SQR(s / (n - 1)): 'Среднеквадратическое значение

v = s1 / c:

'Коэффициент вариации

'Вычисление доверительных границ

sq = SQR(4 * n - 1)

 

t1 = 4 * n / ((sq + u) ^ 2): t2 = 4 * n / ((sq - u) ^ 2)

m2 = c * t1: m3 = c * t2: 'Довер. границы среднего значения

CALL sort(n, a()):

'Ранжирование массива чисел по возрастанию

'ОСНОВНЫЕ ХАРАКТЕРИСТИКИ ЗАКОНА РАСПРЕДЕЛЕНИЯ

l = 1 / c: 'Параметр экспоненциального закона распределения LAMBDA t3 = 4 * (n - 1) / ((sq - u) ^ 2): t4 = 4 * (n - 1) / ((sq + u) ^ 2)

l1 = l / t3: l2 = l / t4: 'Довер. границы параметра закона 'Вычисление количества частичных интервалов

f = INT(3.322 * LOG(n) / LOG(10) + 1): 'Количество интервалов DIM m(f + 2), m1(f + 2), z(f + 1), f1(f + 1), f2(f + 1), f3(f + 1), p1(f + 1) DIM p2(f + 1), k(f + 1), k1(f), f4(f + 1), f5(f + 1), f6(f + 1), p4(f + 1)

224

d = (a(n) - a(1)) / f: 'Длина интервала

'Вычисление середины интервала m1(j) и значение левой границы интервала m(j)

f = f + 1: m1(1) = a(1): m(1) = a(1) - d / 2: IF m(1) < 0 THEN m(1) = 0 FOR j = 2 TO f: m1(j) = m1(j - 1) + d: m(j) = m1(j) - d / 2:

NEXT

'Количество замеров, входящих в интервал

FOR j = 1 TO f - 2: z(j) = 0 FOR i = 1 TO n

IF a(i) < m(j + 1) AND a(i) >= m(j) THEN z(j) = z(j) + 1 NEXT i

NEXT j z(f) = 0

FOR i = 1 TO n

IF a(i) >= m(f - 1) THEN z(f) = z(f) + 1

NEXT

 

k(1) = z(1)

 

FOR j = 1 TO f

 

k(j) = k(j - 1) + z(j):

'Накопленное число отказов

f1(j) = k(j) / n:

'Накопленная частость отказа

p1(j) = 1 - f1(j):

'Накопленная частость безотказности

f2(j) = z(j) / n / d:

'Частость в интервале

p2(j) = EXP(-l * (m(j) + d(2))): 'Вероятность безотказной работы

f3(j) = 1 - p2(j):

'Вероятность отказа

f4(j) = l * EXP((-l) * (m(j) + d(2)))

f5(j) = EXP((-l2) * (m(j) + d(2))): 'Нижняя

f6(j) = EXP((-l1) * (m(j) + d(2))): 'Верхняя NEXT

'90% - ресурс

g = -LOG(.9): g1 = g / l: g2 = g / l1: g3 = g / l2

x1 = 0: FOR j = 1 TO f: x1 = x1 + f4(j): NEXT: c2 = 1 / x1 'Проверка по критерию согласия

x2 = 0: FOR j = 1 TO f

p4(j) = f4(j) * c2 * n: x2 = x2 + (z(j) - p4(j)) ^ 2 / p4(j): NEXT s5 = f - 2: x3 = (x2 - s5) / SQR(2 * s5)

225

'............................................................................

PRINT #1, STRING$(80, 46): PRINT #1, TAB(10); "СТАТИСТИЧЕСКИЕ

ХАРАКТЕРИСТИКИ"

 

PRINT #1, STRING$(80, 46): PRINT #1, "Число интервалов

F="; f

PRINT #1, "Длина интервала"; TAB(34); "d="; d

 

PRINT #1, "Среднее арифметическое"; TAB(32); "acp="; c

 

PRINT #1, "Среднеквадратическое отклонение S1="; s1

 

PRINT #1, "Коэффициент вариации"; TAB(34); "V="; v

 

PRINT #1, STRING$(80, 46)

 

PRINT #1, "Сер. инт."; TAB(10); " Число отк."; TAB(26); " Частость"; PRINT #1, TAB(42); " Безотк. "; TAB(58); "Накопл. частость" PRINT #1, STRING$(80, 46)

FOR j = 1 TO f: PRINT #1, m1(j); TAB(11); z(j); TAB(26); f2(j); PRINT #1, TAB(42); p1(j); TAB(58); f1(j): NEXT

PRINT #1, STRING$(80, 46)

PRINT #1, TAB(10); "ТЕОРЕТИЧЕСКИЕ ХАРАКТЕРИСТИКИ": PRINT #1, STRING$(80, 46)

PRINT #1, "Математическое ожидание"; TAB(40); "m="; c PRINT #1, "Нижняя граница математического ожидания "; m2 PRINT #1, "Верхняя граница математического ожидания "; m3 PRINT #1, "Параметр закона"; TAB(42); l

PRINT #1, "Нижняя граница параметра"; TAB(42); l2 PRINT #1, "Верхняя граница параметра"; TAB(42); l1 PRINT #1, "90% ресурс"; TAB(42); g1

PRINT #1, "Нижняя граница 90% ресурса"; TAB(42); g3 PRINT #1, "Верхняя граница 90% ресурса"; TAB(42); g2 PRINT #1, "Число степеней свободы"; TAB(42); s5 PRINT #1, "Критерий Пирсона"; TAB(42); x2

PRINT #1, : PRINT #1, STRING$(80, 46)

PRINT #1, "Сер. инт."; TAB(10); "Плотность распр."; TAB(26); " Вер.

отк.";

PRINT #1, TAB(40); " Вер. безотк."; TAB(54); "Рниж"; TAB(68); "Рверх" PRINT #1, STRING$(80, 46)

FOR j = 1 TO f

PRINT #1, m1(j); TAB(11); f4(j); TAB(26); f3(j); TAB(40); p2(j); TAB(54); PRINT #1, f6(j); TAB(68); f5(j)

NEXT

226

PRINT #1, STRING$(80, 46) IF x3 < 3 THEN

PRINT #1, "Теоретический закон удовлетворяет критерию Романовского" ELSE

PRINT #1, "Теоретический закон не удовлетворяет критерию Романовского"

END IF

CLOSE

END

DATA 42

DATA 15, 24, 28, 37, 49, 54, 60, 75, 87, 92

DATA 93, 111, 114, 121, 127, 130, 134, 138, 140, 144

DATA 147, 149, 155, 168, 170, 173, 189, 192, 197, 198

DATA 201, 204, 225, 231, 243, 248, 249, 256, 265, 274

DATA 281, 297

DATA .99

SUB klawa

PRINT STRING$(80, 46); "Нажмите любую клавишу"

DO WHILE INKEY$ = "": LOOP: CLS

END SUB

SUB sort (n, x())

FOR i = 1 TO n - 1: FOR j = i + 1 TO n: IF x(i) >= x(j) THEN SWAP x(i), x(j): NEXT j, i

PRINT #1, "Упорядоченный массив N="; n

FOR j = 0 TO n STEP 10: k = 0: WHILE k <= 9 AND w < n: k = k + 1! w = j + k: PRINT #1, x(w); : WEND: PRINT #1,

NEXT j

END SUB

FUNCTION Up (P)

'Квантиль нормального распределения

q = 1 - P: t = SQR(-2 * LOG(q)): a = (.010328 * t + .802853) * t + 2.515517

227

b = ((.001308 * t + .189269) * t + 1.432788) * t: x = t - a / (1 + b): Up = x

END FUNCTION

Приложение 5 Программа расчета основных показателей СМО

DECLARE SUB po (c!(), z!())

DECLARE SUB cf (e!, l!)

DECLARE SUB klawa ()

DECLARE SUB kodcmo (e!)

DECLARE SUB zaglist ()

'СИСТЕМА МАССОВОГО ОБСЛУЖИВАНИЯ АВТОМОБИЛЬНОГО ТРАНСПОРТА

 

CALL zaglist

 

'------------

ВВОД ИСХОДНЫХ ДАННЫХ----------------------------------

 

 

DIM z(25)

 

 

j = 0: PRINT STRING$(80, 46); "И С Х О Д Н Ы Е Д А Н Н Ы Е "

 

PRINT STRING$(80, 46); "Код целевой функции"; STRING$(25, 46);

"Кцф=";

 

 

INPUT a: CALL kodcmo(e)

 

 

PRINT "Интенсивность потока заявок"; STRING$(17, 46); " Инт="; :

INPUT z(8)

 

 

INPUT "Трудоемкость обслуживания заявки ............

ТРо="; z(9)

 

CALL cf(e, l)

 

 

PRINT "Удельные затраты одного аппарата обслуживания"

 

INPUT "(при СА=0 оптимизация не производится)........

CA="; c(2)

 

IF c(2) = 0! THEN c(3) = 0!: c(4) = 0!: c(5) = 0!: GOTO 592

 

INPUT "Удельные потери от необслуженной заявки ......

СП="; c(3)

 

INPUT "Удельные затраты одного оператора ............

СО="; c(4)

 

INPUT "Удельные затраты одного места ожидания .......

CH="; c(5)

q = 1!: a(1) = 1!: a(2) = 0!: a(3) = 1!: z(10) = 1E+09: c(1) = z(10) FOR r = 1! TO 8!: q = -q: FOR p = 1! TO 3!

480 : a(p) = a(p) - q: z(11) = a(1): z(12) = a(2) z(13) = a(3): GOSUB 700

228

IF z(10) < c(1) THEN c(1) = z(10): GOTO 480 a(p) = a(p) + q

NEXT p, r

z(5) = a(1): z(6) = a(2): z(7) = a(3) CALL po(c(), z())

592 : j = j + 1!

PRINT STRING$(80, 45); j; "Ч А С Т Н Ы Й Р Е Ж И М " PRINT "Ввести количество аппаратов обслуживания" INPUT "(S=0 -> END) .................................S="; z(11)

IF z(11) = 0! THEN END

INPUT "Ввести количество мест накопителя ............M="; z(12) PRINT "Ввести количество операторов каждого"

PRINT "аппарата обслуживания"; STRING$(30, 46); "N="; : INPUT z(13) GOSUB 700: PRINT STRING$(80, 45)

z(14) = 1 / s: z(15) = z(2) / s: z(16) = z / s: z(17) = z(3) + z(15)

PRINT "Р Е З У Л Ь Т А Т Ы Р А С Ч Е Т А "; STRING$(80, 46) PRINT "1. В е р о я т н о с т н ы е х а р а к т е р и с т и к и" PRINT "Вероятность того, что аппараты свободны .....PO="; z(14) PRINT "Вероятность того, что в системе S требований Ps="; z(15)

PRINT "Вероятность полного отказа"; STRING$(16, 46); "Pпотк="; z(16) PRINT "Вероятность наличия очереди"; STRING$(15, 46); "Pоч="; z(3) PRINT "Вероятность занятости всех аппаратов ........Pза="; z(17)

PRINT "2. К о л и ч е с т в е н н ы е х а р а к т е р и с т и к и" PRINT "Ср. количество требований, прибывающих в"

PRINT "CMO за время обслуживания одного требования .Mт="; z(1) PRINT "Среднее количество свободных АО"; STRING$(20, 46); "Sc="; z(18)

PRINT "Ср. количество занятых аппаратов обслуживания Sз="; z(11) - z(18)

PRINT "Среднее количество заявок в накопителе .....Mнак="; z(19) PRINT "Среднее количество заявок в CMO"; STRING$(12, 46); PRINT "Mсмо="; z(11) - z(18) + z(19)

PRINT "3. В р е м е н н ы е х а р а к т е р и с т и к и "

229

PRINT "Среднее время простоя в очереди"; PRINT STRING$(20, 46); "Tпр="; z(19) / z(8)

PRINT "Среднее время пребывания заявки в CMO .....Tсмо="; PRINT z(19) / z(8) + z(9) / z(13)

PRINT "4. K а ч е с т в е н н ы е х а р а к т е р и с т и к и" PRINT "Коэффициент загрузки CMO"; STRING$(20, 46); PRINT "Kзсмо=Mт/S="; z(1) / z(11)

PRINT "Пропускная способность СМО ....ПР=Иинт*(1-Pпотк)="; PRINT z(8) - z(8) * z / s

IF c <> 0 THEN

PRINT "Коэффициент загрузки накопителя ......Kзн=Mнак/M="; z(19) / z(12)

END IF

PRINT "Коэффициент загрузки AO"; STRING$(15, 46); PRINT "Kзао=Sз/S="; 1! - z(18) / z(11)

PRINT "Величина целевой функции"; STRING$(20, 46); "ЦФ="; z(10): GOTO 592

'Подпрограммы расчета

700: IF z(13) < 1! THEN z(13) = 1!

IF z(11) < 1! THEN z(11) = 1!: IF z(12) < 0! THEN z(12) = 0! z(1) = z(8) * z(9) / z(13): x = z(8) / z(13) / l

z(18) = z(11): z(19) = 0!: z = 1!: s = 1!: z(2) = 0!: z(3) = 0!: n = 0 DO: n = n + 1: u = ABS(z(11) - n): v = (z(11) - n - u) / 2! ‘Рекуррентные выражения

SELECT CASE e

CASE 1: z = z * z(1) * (l + 1! - n) / (v + n) CASE 2: z = z * z(1) / (v + n + n * x) CASE 3: z = z * z(1) / (v + n - v * x) CASE 4: z = z * z(1) / (v + n)

IF v <> 0 THEN z = z - z * EXP(z(11) / x / v) CASE IS > 4: END

END SELECT

s = s + z: IF u = 0 THEN z(2) = z IF n > z(11) THEN

z(19) = z(19) + u * z: z(3) = z(3) + z

230