Назад | Начало урока | Вперед
Содержание

Глава 06

Пример 6.3 Stats Статический анализ
Пример 6.4 LightBulbAnalysis Время службы лампочек

Вверх

Пример 6.3 Статический анализ

Задача Под статистическим операциями с элементами массива следует понимать подсчет среднего значения (mean - xm) и стандартного отклонения. Надлежит разработать методы для этих операций и поместить их в библиотеку, с тем, чтобы обеспечить к ним легкий доступ.

Решение Если мы имеем некоторое множество значений xi, мы можем проанализировать их и найти среднее значение xm и стандартное отклонение s, показывающее на сколько каждый показатель может отклониться от средней величины. Другими словами стандартное отклонение позволяет определить разброс в значениях.

Теория Среднее значение xi, где i=1,2,...,n, определяется по формуле:

Подсказка

а формула для вычисления стандартного отклонения имеет следующий вид:

Подсказка

Принимая во внимание возможные ошибки и разброс значений, мы можем сказать, что результаты множества измерений находятся в рамках определенного стандартного отклонения. Во многих случаях действительный результат находится в диапазоне от xm-2s до xm+2s, то есть среднее значение плюс/минус двойное стандартное отклонение.

Конструкция метода. Написание метода для вычисления среднего значения не составляет большого труда. Для этого мы будем использовать цикл for. Поскольку в формуле для определения стандартного отклонения используется среднее значение , этот метод должен быть определен после метода, предназначенного для нахождения среднего значения. Вот как выглядят оба метода:

package myutilities;

public class Stats {

public static double mean (double a[], int n) {

double sum = 0;
for (int i = 1; i<=n; i++)
sum += a[i];
return sum / n;
}

public static double stddev (double a[], int n, double ave) {

double sum = 0;
for (int i = 1; i <= n; i++)
sum += (ave - a[i])*(ave - a[i]);
return Math.sqrt(sum / (n-1));
}
}

В обоих методах в качестве параметра передается массив a[], среднее значение (ave), но обратите внимание, что мы так же передаем переменную n для определения используемого количества элементов массива. Мы можем определять средние значения, используя выбрку начальной части массива определенной длины n. При передаче массива методу mean() или stddev() характеристика a.length даст предельное значение длины массива (например 1000), в то время ка используемая длина массива будет меньше (скажем 256). Теперь давайте рассмотрим как поместить в библиотеку указанные методы.

Расширение библиотеки. Методы mean и stddev являются отличными кандидатами для включения в библиотеку полезных процедур, которую мы начали разрабатывать в примере 4.9. Структура библиотеки такова: методы находятся в классах, которые в свою очередь содержатся в пакете. Мы уже сталкивались с пакетом java.io, а так же с очень полезным пакетом javagently, который был специально разработан для данной книги. В пакете javagently предлагаются следующие классы: Stream, Display, Graph.

Методы мы добавим не в пакет javagently, а в пакет myutilities, где уже находится класс Filer. При работе с Java используется следующий способ создания методов и помещение их в новый класс нового пакета:

package myutilities;

public static class Stats {

public static double mean (double a[], int n) {

...
как и прежде
}

public static double stddev (double a[], int n, double ave) {

...
как и прежде
}
}

Указанный выше класс помещается в файл Stats.java. Компилирование этого класса должно быть выполнено в каталоге myutilities. Путь к классу расширяется так, чтобы включить каталог, содержащий пакет myutilities (рис 4.2). Предварительно туда необходимо поместить файл Stats.java. В результате любая программа, которая захочет использовать эти методы, должна будет импортировать пакет myutilities* и вызвать нужный метод следующим образом:

ave = Stats.mean (myreadings, number);

Обратите внимание на то, что класс и его методы объявлены открытыми, поэтому их можно "видеть" из других пакетов.

Вверх

Пример 6.4 Время службы лампочек

Эта программа интересна мне теми математическими формулами, которыми она здесь оперирует.
Это созданные нами две полезных функции - нахождение среднего значения и вычисление стандартного отклонения.


import java.io.*;
import javagently.*;
import myutilities.*;

class LightBulbAnalysis {

/* The light bulb program J M Bishop 1990, 1998
* ---------------------- updated May 2000
*
* Calculates the average light of light bulbs
* Uses the mean and stddev methods created
* in a Stats class in the myutilities package.
*
* Illustrates array i/o again
*/

LightBulbAnalysis () throws IOException {

int max = 101;
Display display = new Display("Light Bulb Analysis");

display.println ("***** Light Bulb Analysis *****\n");
display.println ("Statistical analysis of the lifetime of "+
"light bulbs");
display.println("with no. of readings < "+max);
display.println("Enter in the readings pressing ready after each one");
display.println("Enter yes for stop with the last reading");
display.prompt("Hours",0);
display.prompt("Stop", "no");

double hourReadings [] = new double[max];
int n = 0;
boolean stop = false;
for (n=1; n < max & !stop; n++) {

display.ready();
hourReadings[n] = display.getDouble("Hours");
display.print(Stream.format(hourReadings[n],6,1)+" ");
stop = display.getString("Stop").equalsIgnoreCase("yes");
}
n--;
display.println("\nThat's the data, thanks");
display.println("There were "+n+" samples");

if (n == 1) {

System.out.println("Mean = "+
Stream.format(Stats.mean(hourReadings,n),10,6)+
" but standard deviation not defined for n=1");
}

else {

double ave = Stats.mean(hourReadings,n);
display.println("Mean = "+Stream.format(ave,6,2)+ " hours");
display.println("Standard deviation = " +
Stream.format( Stats.stddev(hourReadings,n,ave),6,2) + " hours");

}
}

public static void main (String [] args) throws IOException {

new LightBulbAnalysis ();
}
}

Подсказка

Рис 6.9 Результат работы программы "Анализ срока службы лампочек"

Анализ:

class LightBulbAnalysis {

LightBulbAnalysis () throws IOException {

int max = 101;

Объявления и сообщения:

Display display = new Display("Light Bulb Analysis");

display.println ("***** Light Bulb Analysis *****\n");
display.println ("Statistical analysis of the lifetime of "+
"light bulbs");
display.println("with no. of readings < "+max);
display.println("Enter in the readings pressing ready after each one");
display.println("Enter yes for stop with the last reading");

Создадим два поля TextField, массив чисел double
и булевую переменную для остановки ввода данных:

display.prompt("Hours",0);
display.prompt("Stop", "no");

double hourReadings [] = new double[max];
int n = 0;
boolean stop = false;

Заполним в цикле созданный нами массив данными.
Одновременно будем выводить на экран введенные данные.
Выйдем из цикла по условию

for (n=1; n < max & !stop; n++) {

display.ready();
hourReadings[n] = display.getDouble("Hours");
display.print(Stream.format(hourReadings[n],6,1)+" ");
stop = display.getString("Stop").equalsIgnoreCase("yes");
}
n--;
display.println("\nThat's the data, thanks");
display.println("There were "+n+" samples");

Массив инициирован, теперь можно с ним работать

Если введено только одно значение:

if (n == 1) {

System.out.println("Mean = "+
Stream.format(Stats.mean(hourReadings,n),10,6)+
" but standard deviation not defined for n=1");
}

Если значений несколько:

else {

double ave = Stats.mean(hourReadings,n);
display.println("Mean = "+Stream.format(ave,6,2)+ " hours");
display.println("Standard deviation = " +
Stream.format( Stats.stddev(hourReadings,n,ave),6,2) + " hours");

}
}

public static void main (String [] args) throws IOException {

new LightBulbAnalysis ();
}
}


Назад | Начало урока | Вверх | Вперед
Содержание

Hosted by uCoz