Глава 06
Вверх
Пример 6.3 Статический анализ
Задача Под статистическим операциями с элементами массива следует понимать подсчет среднего значения (mean - xm) и стандартного отклонения. Надлежит разработать методы для этих операций и поместить их в библиотеку, с тем, чтобы обеспечить к ним легкий доступ.
Решение Если мы имеем некоторое множество значений xi, мы можем проанализировать их и найти среднее значение xm и стандартное отклонение s, показывающее на сколько каждый показатель может отклониться от средней величины. Другими словами стандартное отклонение позволяет определить разброс в значениях.
Теория
Среднее значение xi, где i=1,2,...,n, определяется по формуле:
а формула для вычисления стандартного отклонения имеет следующий вид:
Принимая во внимание возможные ошибки и разброс значений, мы можем сказать, что результаты множества измерений находятся в рамках определенного стандартного отклонения. Во многих случаях действительный результат находится в диапазоне от xm-2s до xm+2s, то есть среднее значение плюс/минус двойное стандартное отклонение.
Конструкция метода. Написание метода для вычисления среднего значения не составляет большого труда. Для этого мы будем использовать цикл for. Поскольку
в формуле для определения стандартного отклонения используется среднее значение
, этот метод должен быть определен после метода, предназначенного для нахождения среднего значения. Вот как выглядят оба метода:
public class Stats
{
public static double mean (double a[], int n)
{
public static double stddev (double a[], int n, double ave)
{
В обоих методах в качестве параметра передается массив 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 используется следующий способ создания методов и помещение их в новый класс нового пакета:
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 Время службы лампочек
Эта программа интересна мне теми математическими формулами, которыми она здесь оперирует.
class LightBulbAnalysis
{
/* The light bulb program J M Bishop 1990, 1998
LightBulbAnalysis () throws IOException
{
display.println ("***** Light Bulb Analysis *****\n");
double hourReadings [] = new double[max];
if (n == 1)
{
else
{
public static void main (String [] args) throws IOException
{
Рис 6.9 Результат работы программы "Анализ срока службы лампочек"
Анализ:
LightBulbAnalysis () throws IOException
{
Объявления и сообщения:
display.println ("***** Light Bulb Analysis *****\n");
Если введено только одно значение:
if (n == 1)
{
public static void main (String [] args) throws IOException
{
Назад |
Начало урока |
Вверх |
Вперед
package myutilities;
for (int i = 1; i<=n; i++)
for (int i = 1; i <= n; i++)
package myutilities;
как и прежде
как и прежде
Это созданные нами две полезных функции - нахождение среднего значения и вычисление стандартного отклонения.
import java.io.*;
import javagently.*;
import myutilities.*;
* ---------------------- 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
*/
Display display = new Display("Light Bulb Analysis");
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");
int n = 0;
boolean stop = false;
for (n=1; n < max & !stop; n++)
{
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");
Stream.format(Stats.mean(hourReadings,n),10,6)+
" but standard deviation not defined for n=1");
display.println("Mean = "+Stream.format(ave,6,2)+
" hours");
display.println("Standard deviation = " +
class LightBulbAnalysis
{
Display display = new Display("Light Bulb Analysis");
Создадим два поля TextField, массив чисел double
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++)
{
Массив инициирован, теперь можно с ним работать
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");
Если значений несколько:
Stream.format(Stats.mean(hourReadings,n),10,6)+
" but standard deviation not defined for n=1");
else
{
display.println("Mean = "+Stream.format(ave,6,2)+
" hours");
display.println("Standard deviation = " +
Содержание