Определение числа ошибок в ПО с помощью Java

Добавлено: 02/12/2017 21:36 |  Обновлено: 02/12/2017 23:04 |  Добавил: nick |  Просмотры: 300 Комментарии: 0
Вводная часть
В материале рассмотрен пример определения вероятного количества ошибок в крупной программной системе, используя язык Java. Для расчетов используется модель Джелинского-Моранды.
В таблице ниже приведены данные отладки программной системы. Задача найти общее число ошибок в данной системе, используя модель Джелинского-Моранды.
Номер ошибки (i) Интервал между ошибками (Xi, дни) Номер ошибки (i) Интервал между ошибками (Xi, дни) Номер ошибки (i) Интервал между ошибками (Xi, дни) Номер ошибки (i) Интервал между ошибками (Xi, дни)
1 9 8 8 15 4 22 33
2 12 9 5 16 1 23 7
3 11 10 7 17 3 24 91
4 4 11 1 18 3 25 2
5 7 12 6 19 6 26 1
6 2 13 1 20 1    
7 5 14 9 21 11    
Для решения задачи воспользуемся уравнением: Рассчитав правую часть уравнения, получим следующий результат: Решим это нелинейное уравнение численным методом. Для расчета воспользуемся языком Java.

Код для расчета должен быт следующим:
public class FindErrors {

	static final int[] a = {9, 12, 11, 4, 7, 2, 5, 8, 5, 7, 1, 6, 1, 9, 4, 1, 3, 3, 6, 1, 11, 33, 7, 91, 2, 1};
	static final int lenghA = a.length;
	static final int HIGH = 100000;
	static final double STEP = 0.0001;

	static double left(double b) {
		double result = 0;
		for (int i = 0, j = 1; i < lenghA; i++, j++) {
			result += (1 / (b - j + 1));
		}
		return result;
	}

	// Сумма интервалов между ошибками.
	static double getSum() {
		long result = 0;
		for (int i = 0; i < lenghA; i++) {
			result += a[i];
		}
		return result;
	}

	// Сумма произведений интервалов между ошибками на их порядковый номер.
	static double getSumI() {
		double result = 0;
		for (int i = 0, j = 1; i < lenghA; i++, j++) {
			result += j * a[i];
		}
		return result;
	}

	static double right(double b) {
		return (lenghA * getSum()) / ((b + 1) * getSum() - getSumI());
	}
	
	public static void main(String[] args) {
		double r, r1;
		double d = lenghA;
		r = Double.POSITIVE_INFINITY;
		for (int i = 1; i < HIGH; i++) {
			r1 = r;
			r = Math.abs(left(d) - right(d));
		    // Если текущая разница превысит предыдущую разницу, выходим
		    if (r > r1) {
		    	break;
		    }
		    d = d + STEP;
		}
		System.out.println(d);
	}
}
Результат выполнения кода: 31.215999999987844. Значит общее число ошибок в данной системе примерно может быть равно 31.

Комментариев нет

Оставьте свой комментарий