Расчет затрат на проектирование системы 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Расчет затрат на проектирование системы



ВВЕДЕНИЕ

В данной выпускной квалификационной работе рассматривается Разработка программного модуля для сохранения данных задачи моделирования.

Актуальность выбранной темы определяется требованиями заказчика.

Целью квалификационной работы является разработать программный модуль, который позволит сохранять полученные результаты задачи моделирования в XML-файл.

Задачи квалификационной работы:

– Изучить предметную область Моделирование;

– Разработать алгоритмы сбора данных;

– Разработать структуру XML-файла;

– Оценить эффективность разработанного приложения.

Выпускная квалификационная работа включает в себя три основные части: теоретическая, практическая и экономическая.

Теоретическая часть выпускной квалификационной работе содержит цели разработки программы и требования к готовым программным продуктам, а также характеристики средств, с помощью которых была разработана информационная система.

Практическая часть выпускной квалификационной работе связана с разработкой программного продукта: постановка задачи, описание системы, с помощью которого решается задача, моделирование предметной области, составление алгоритма функционирования программного продукта, описание работы программного продукта, перспективы развития программного продукта.

Экономическая часть выпускной квалификационной работы содержит описание экономической сущности задачи, оценку затраты на разработку и внедрение программного продукта, расчёт экономической эффективности проекта.


Теоретическая часть

1.1. Анализ предметной области

Начальным этапом выпускной квалификационной работы, является определение предметной области. Она играет большую роль в анализе, структурировании данных и позволяет классифицировать и формализовать информацию обо всех процессах данного исследования.

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

Предметом для рассмотрения является контейнер моделирования.

В настольном приложении моделирование и прогнозирование выполняется в рамках контейнера моделирования.

Контейнер моделирования - объект репозитория, предназначенный для формирования математических моделей процессов (явлений) и проведения расчетов на их основе. Результатом расчетов является решение различного типа задач, включающих задачи исследования данных, задачи прогнозирования, задачи управления, задачи оптимального управления, задачи имитации и другие.

Задача моделирования и прогнозирования решается путем создания и настройки взаимодействия следующих объектов:

– переменных;

– моделей;

– метамоделей;

– задач.

Объект «Переменная» служит для получения исходных данных и возвращения результатов выполнения алгоритма расчета.

Объект «Модель» предназначен для формирования математического описания оператора, который преобразует наблюдаемое входное воздействие в его реакцию. Данный объект позволяет задавать различные методы расчета.

Объект «Метамодель» позволяет организовывать цепочку расчета и объекты модели в виде многоуровневого графа и предназначен для описания логики моделирования произвольной задачи/процесса.

Объект «Задача» - объект, который позволяет решать различные типы задач над метамоделями и формирует различные сценарии расчета.

Кроме объектов моделирования контейнер может содержать ярлыки на любые другие объекты репозитория Prognoz Platform, таких как отчеты, формы и т.д.

1.2. Требования к программному продукту

1.2.1. Функциональные требования

Программный модуль должен выполнять следующие функции:

По выбранной задаче моделирования:

1) находить данные задачи, а именно:

– название модели и ключ;

– период моделирования;

– период прогнозирования;

– находить все модели принадлежащих этой задаче;

2) находить данные модели:

– находить название модели и ключ;

– находить формулу, по которой рассчитана модель;

– находить тип модели;

3) находить факторы модели:

– название и ID фактора;

– оценка фактора;

– стандартная ошибка;

– вероятность фактора;

– T-статистика;

4) находить статистические характеристики модели, а именно ID и значение;

5) сохранить данные в соответствующей структуре XML-файла.

1.2.2. Требования к надежности

- Одновременно программным модулем может пользоваться только один пользователь.

- Результатом будет XML-файл с заранее определенной структурой.

1.2.3. Условия эксплуатации

Программный модуль предназначен для использования неограниченного числа раз.

 

1.2.4. Системные требования

Требования к техническим характеристикам компьютера

- Процессор – Intel Pentium/AMD 1.5 ГГц и выше

- Объем оперативной памяти – 256 Мб и выше;

 

Требования к составу периферийных устройств

- Монитор;

- Манипулятор «Мышь»;

- Клавиатура.

 

Требования к составу программных средств

- ОС Windows 2000/XP/7/Vista/8/10;

- Prognoz Platform ver.7.2 и выше;

1.2.5. Требования к персоналу

Пользователь должен иметь опыт работы в среде Prognoz Platform и иметь навыки работы в области моделирования.

Специалист по сопровождению должен иметь опыт работы в среде Prognoz Platform, знать язык программирования Fore.

1.3. Сравнительный анализ существующих программных продуктов

На данным момент в сети Интернет аналогов программному модулю нет.

Нет такой программы, которая бы собирала данные задачи моделирования и сохраняла в XML-файл. На данный момент в системе Prognoz Platform не предусмотрено сохранение, полученные данные выводятся на экран. Поэтому необходимо разработать данное приложение.

 

2. ПРАКТИЧЕСКАЯ ЧАСТЬ

2.1. Постановка задачи

Исходя из темы дипломного проекта, следует разработать программный модуль, для нахождения и сохранения данных задачи моделирования в XML-файл»

В программном модуле предусмотреть выполнение следующих функций, которые были ранее описаны в пункте 1.2.1 дипломной проекта.

2.2. Выбор средств и технологии создания программного продукта

В компании Прогноз используют множество языков программирования, такие как Fore, C#, Delphi и другие.

Будучи объектно-ориентированным высокоуровневым языком программирования, Fore аккумулирует в себе множество преимуществ других языков. За счет объектно-ориентированности он обладает инкапсуляцией, наследованием и полиморфизмом. В Fore присутствуют интерфейсы, классы, объекты, присущие им наследования, переопределение и т.д. Выделение памяти реализовано здесь наподобие C#: программисту не надо существенно озадачиваться внутренним механизмом работы памяти, что существенно упрощает разработку. Помимо этого стоить отметить, что в Fore работает «сборщик мусора», который позволяет освобождать выделенную, но не используемую память, что, в свою очередь, защищает от утечек памяти.

C# - язык программирования, сочетающий объектно-ориентированные и аспектно-ориентированные концепции. Разработан в 1998—2001 годах группой инженеров под руководством Андерсa Хейлсбергa в компании Microsoft как основной язык разработки приложений для платформы Microsoft.NET. Компилятор с C# входит в стандартную установку самой.NET, поэтому программы на нём можно создавать и компилировать даже без инструментальных средств вроде Visual Studio.

Delphi является языком программирования и средой разработки программного обеспечения. Он разработан Borland (ранее известный как Inprise). Язык программирования Делфи, ранее известный как Object Pascal (Pascal с объектно-ориентированными расширениями), первоначально ориентированный только на Microsoft Windows, но в настоящее время позволяет строить собственные приложения для Linux и Microsoft. NET Framework, и других (см. ниже). Программирование для начинающих.
Наиболее популярное использование – разработка настольных приложений и баз данных предприятия, а как инструмент язык программирования Делф и может использоваться и для большинства типов развивающихся проектов. Это был один из первых языков, который стал известным как инструмент RAD (быстрая разработка приложений), когда вышел в 1995 году. Delphi 2, вышедший год спустя, поддерживал 32-разрядную среду Windows, и а только несколько лет спустя вышли C, C + + Builder. В 2001 году стала доступна версия под ОС Linux известная как Kylix (классическая греческая урна). Каждый год выходило по одной новой версии, в 2002 году продукт стал известен как Delphi 7 Studio, язык стал официально называться язык программирования Delphi, а не Object Pascal, а также была добавлена поддержка Linux (через Kylix) и. NET (через Предварительный компилятор).

Для данного программного модуля был выбран объектно-ориентированный язык программирования Fore, в среде разработки Prognoz Platform.

Потому что программный модуль разрабатывается для компании Прогноз, которая использует и является разработчиком языка программирования Fore работающий в среде Prognoz Platform.

 

2.3. Моделирование предметной области

2.3.1. Концептуальная модель

При разработке ER-моделей необходимо получить следующую информацию о предметной области:

- Список сущностей предметной области;

- Список атрибутов сущностей.

В данной предметной области выделены следующие виды сущностей:

– задача;

– модель;

– факторы модели;

– статистические характеристики модели.

Выделяем у каждой сущности атрибуты:

Объект «Задача» имеет следующий список атрибутов:

- Наименование;

- Ключ;

- Дата начала моделирования;

- Дата конца моделирования;

- Дата начала прогнозирования;

- Дата конца прогнозирования.

Объект «Модель» имеет следующий список атрибутов:

- Наименование;

- Тип;

- Ключ;

- Уравнение.

Объект «Фактор» имеет следующий список атрибутов:

- Наименование;

- ID;

- Оценка фактора;

- Стандартная ошибка;

- Вероятность;

- T-статистика.

Объект «Статистические характеристики» имеет следующий список атрибутов:

- ID;

- Значение;

 

Рис 1. Концептуальная модель

 

2.3.2. Логическая модель

Рис 2. Логическая модель

2.3.3. Физическая модель

Рис 3.Физическая модель

 

2.4. Алгоритм функционирования программного продукта

Рис 4 Блок-схема Алгоритм функционирования программного продукта

 

2.5. Описание работы программного продукта

При запуске программного модуля на экране открывается окно- рабочая форма «Обработка моделей» (см рис. 5).

Рис. 5 Форма

Тут нужно задать количество знаков после запятой (см рис.6)

Рис. 6

И выбрать задачу моделирования (см. рис. 7).

Рис. 7

Кнопка «Рассчитать» выполняет сбор данных, создает структуру XML-файла и сохраняет файл.

2.6. Перспективы развития программного продукта

Внедрение программного модуля предполагается в систему для предприятий, работающих в сфере Моделирования и прогнозирования. Цель внедрения, увеличить скорость выполнение задач в данной сфере.

Программные средства, позволяющие сопровождать программный продукт:

- Prognoz Platform.

Программный продукт разработан на Prognoz Platform.

Как было описано ранее Prognoz Platform актуальна для предприятия, так как является ее разработчиком.

3. Экономическая часть

Исходные данные для расчета затрат

В дипломном проекте разработан программный модуль для сохранения данных задачи моделирования.

Общая стоимость владения (ОСВ) представляет собой совокупность затрат, осуществляемых на следующих стадиях жизненного цикла: разработка технологического проекта, его внедрение, эксплуатация и сопровождение.

Определим исходные данные для расчета затрат на осуществление технического проекта системы. При проектировании используется трудовой потенциал сотрудников, а также персональный компьютер и специальное программное обеспечение для проектирования системы.

Сведем в таблицу 1 трудоемкость инженерно-технического персонала.

Таблица 1. – Трудоемкость работы исполнителей

Должность Оклад (О), (руб./мес. или руб./час). Трудоемкость (Т), дней (часов или месяцев)
Руководитель проекта 25000 (руб./мес) 5(д.)
Аналитик 20000 (руб./мес) 3(д)
Специалист по тестированию ПО 18000 (руб./мес) 4(д.)
Разработчик 18000(руб./мес) 20(д.)

Руководитель проекта следит за проектированием и разработкой приложения, внедрением приложения. В сферу деятельности аналитика входит исследование предметной области, разработка пред проектных решений, разработка технического задания, разработка проектных решений, анализ экономической эффективности и исследование безопасных условий при работе проектируемой системы. Программист занимается написанием программного модуля для предприятия и отладкой.

Для определения амортизационных отчислений сведем в таблицу 2 используемое оборудование и программное обеспечение (ПО), используемое при проектировании системы.

Таблица 2. – Используемое оборудование и ПО для проектирования системы

Наименование оборудования Кол-во единиц Первоначальная стоимость, руб.
Персональный компьютер     25000 руб.
Microsoft office 2013   4250 руб.

 

Ниже определим исходные данные для расчета затрат на внедрение системы.

При внедрении систем учитываются трудозатраты сотрудников, осуществляющих работы, а также затраты на оборудование, комплектующие, материалы и специальное программное обеспечение, позволяющее физически реализовать и обеспечить качество системы. Они показаны в таблице 3.

Таблица 3. – Затраты на внедрение системы

Наименование затрат Цена (руб./ед.) Количество Сумма (руб.)
Стоимость базового программного обеспечения
ОС Windows 7      
Стоимость базового оборудования
ПК EliteDesk800/ Core i5/ 4GB/ 500GB/ HD 4600/ 19”Philips 1924n/DVDRW/ кл.+мышь      
Работы по внедрению
Наименование работ Время, дни Оклад (руб./день) Сумма (руб.)
Проектирование системы      
Написание программного кода      
Тестирование системы      
Создание руководства пользователя      
Итого:      

 

 

Определим нормы затрат (% берется от основной ставки: зар.платы, стоимости оборудования и т.д.):

- норма дополнительной заработной платы – 10% от основной зар.платы;

- норма премий – 20%;

- коэффициент отчислений в фонды социального страхования – 30% от ФЗП годового;

- норма транспортных расходов – 2-4% от первоначальной стоимости оборудования;

- норма амортизации – 15-20%;

- норма затрат на техническое обслуживание – 7-9% от первоначальной стоимости оборудования;

- норма затрат на расходные материалы – 2%;

- мощность, потребляемая вычислительной техникой:

а) компьютера – 0,4 кВт/ч. (или см. по техническому паспорту);

- действительный фонд времени работы оборудования – 720 ч.;

- норма накладных расходов – 60%;

- цена 1 кВт электроэнергии – 2,57 руб.;

- норма расходов на хранение и обновление программного обеспечения – 20%;

- норма расходов на содержание и ремонт производственных помещений – 1,5-2%.

Расчет затрат на внедрение

В расчет затрат на внедрение входить затраты на изготовление ПМ с учетом стоимости его аппаратного обеспечения, затраты на транспортировку, отладку и тестирование системы, подготовку документации пользователя, а также вычетом из этого стоимости демонтируемого оборудования, используемого для нужд предприятия или реализуемого.

Затраты на внедрение будут определяться выражением:

(12)

где Зизг – затраты на изготовление системы, руб.;

Зтр – затраты на транспортировку, руб.;

Зм – затраты на монтаж и установку (включая демонтаж), или инсталляцию системы руб.

 

 

Затраты на изготовление (Зизг) определяются как сумма из таблицы 3.

 

Затраты на транспортировку (Зтр) определяются выражением:

 

(13)

 

где Нтр – норма транспортных расходов, руб.

 

 

Подставляя известные значения в выражение (14), найдем затраты на внедрение системы по формуле 12.

 

 

Выводы

Выше были проведены экономические расчеты, связанные с проектированием, построением и продажей со стороны организации-разработчика, и приобретением и эксплуатацией со стороны организации-покупателя приложения по экспорту/импорту данных. Разработчиком создана система, соответствующая требованиям заказчика.

В результате расчетов были получены следующие экономические показатели:

- затраты на создание системы равны руб.;

- цена реализации проекта составляет руб.;

- разработчиком получена и распределена прибыль от реализации проекта, составляющая руб.;

- заказчик понесет капитальные затраты на покупку и внедрение системы, равные руб.;

- срок окупаемости проекта 1 месяца.

Внедрение программного модуля принесет экономический эффект заказчику в виде: сокращение количества сотрудников, экономия средств затрачиваемых на выплату им зарплат и экономию рабочего времени.

Таким образом, разработанная система полностью удовлетворяет требованиям потребителя.


Заключение

Таким образом, в ходе выполнения выпускной квалификационной работы было разработан программный модуль для сохранения данных задачи моделирования в файл, удовлетворяющий всем предъявленным требованиям организации. Программный модуль в полном объеме реализует поставленную цель. На данном этапе приложение планируется к внедрению на предприятие АО «Прогноз».

 

Список литературы

– Справочная система Prognoz PlatForm;

– C/C++. Программирование на языке высокого уровня/ Т. А. Павловская. -СПб.: Питер,2002.-464с.:ил.;

– С++. Объектно-ориентированное программирование: Практикум./ Т. А. Павловская. - СПб.:Питер,2005.-265 с.: ил.

http://msdn.microsoft.com


ПРИЛОЖЕНИЕ 1

ТЕКСТ ПРОГРАММЫ

Обработка моделей

Public Class ModelsXmlGenerator: object

_model: IMsModel;

MB: IMetabase;

Mode: IMsModel;

_Prob: IMetabaseObjectDescriptor;

Shared _T: integer;

Public Shared A: ArrayList;

 

Public Property Model: IMsModel

Get

Begin

Return _model;

End Get

Set

Begin

_model:= value;

End Set

End Property Model;

 

Public Constructor Create(Model: IMsModel; T: integer; Prob: IMetabaseObjectDescriptor);

Begin

Mode:= Model;

_T:= T;

_Prob:= Prob;

End Constructor Create;

 

Public Sub ParseModel;

Var

Eq: IXmlDomElement;

Formula: IMsFormula;

Coord: IMsFormulaTransformCoord;

Calc: IMsMethodCalculation;

sFormula: String;

Transform: IMsFormulaTransform;

VarTrans: IMsFormulaTransformVariable;

OutputVariable: IMsFormulaTransformVariable;

sFormulaKind: String;

Create: ModelsCallback;

Begin

Transform:= Mode.Transform;

If Transform.Kind <> MsModelKind.Simple Then

Return;

End If;

 

If Transform.FormulaCount = 0 Then

Return;

End If;

Formula:= Transform.FormulaItem(0);

If Transform.Outputs.Count = 0 Then

Return;

End If;

VarTrans:= Transform.Outputs.Item(0);

OutputVariable:= Transform.Outputs.Item(0);

Coord:= Transform.CreateCoord(OutputVariable);

ParseFormula(Formula, Eq, sFormulaKind, sFormula, Coord, Calc);

Create:= New ModelsCallback.Create;

Create.Eq:= Eq;

End Sub ParseModel;

 

Function Format(s: Double): string;

Var

CF: ICultureInfo;

SFormat: string;

Begin

CF:= CultureInfo.Invariant;

SFormat:= CF.FormatDoublePrec(S, _T);

SFormat:= string.Replace(SFormat, ",", "");

Return SFormat;

End Function Format;

 

Sub ParseFormula(Formula: IMsFormula; Var Eq: IXmlDomElement; skind, sfromula: String; Coord: IMsFormulaTransformCoord = Null; Calc: IMsMethodCalculation = Null);

Var

Models: Eqs;

Begin

skind:= "Тип модели не подтвержден";

sfromula:= "-";

Select Case Formula.Kind

Case MsFormulaKind.LinearRegression:

skind:= "Линейная регрессия (оценки МНК)";

sfromula:= ParseLR(Formula, Coord, Calc);

Models:= New Eqs.Models(Mode, Formula, sfromula, Coord, _T);

Eq:= Models.GetXMLEqLR;

Case MsFormulaKind.CurveEstimation:

skind:= "Тренд с подбором функциональной зависимости";

sfromula:= ParseCurveEstimation(Formula, Coord, Calc);

Models:= New Eqs.Models(Mode, Formula, sfromula, Coord, _T);

Eq:= Models.GetXMLEqTrend;

Case MsFormulaKind.NonLinearRegression:

skind:= "Нелинейная регрессия (оценка нелинейным МНК)";

sfromula:= ParseNonLinearRegression(Formula, Coord, Calc);

Models:= New Eqs.Models(Mode, Formula, sfromula, Coord, _T);

Eq:= Models.GetXMLEqNLR;

End Select;

 

End Sub ParseFormula;

 

Function ParseLR(Formula: IMsFormula; Coord: IMsFormulaTransformCoord = Null; Calc: IMsMethodCalculation = Null): String;

Var

LR: IMsLinearRegressionTransform;

i, j, r, Lag: Integer;

coef: double;

coeffs: IModelCoefficients;

methodLR: ISmLinearRegress;

builderLR: Istringlist;

Explanatories: ISlSeries;

Intercept: IIntercept;

arma: ISlARMA;

AR, MA: Array Of Integer;

coeffAR, coeffMA: ICoefficients;

terms: IMsCompositeFormulaTermList;

term: IMsCompositeFormulaTerm;

Inver: msInversion;

InverLag: msInversionLag;

G: string;

Begin

LR:= Formula.Method As IMsLinearRegressionTransform;

methodLR:= LR.StatMethod(Coord) As ISmLinearRegress;

builderLR:= New StringList.Create;

//тут надо преобразование для Y

Inver:= LR.Explained.Inversion;

InverLag:= LR.Explained.InversionLag;

G:= GetNameWithInversion("Y", Inver, InverLag);

builderLR.Add(G);

builderLR.Add("=");

coeffs:= methodLR.ModelCoefficients;

Intercept:= coeffs.Intercept;

If Intercept.Mode <> InterceptMode.None Then

coef:= Intercept.Estimate;

builderLR.Add(Format(coef));

If coef >= 0 Then

builderLR.Add(" + ");

End If;

End If;

j:= 0;

terms:= LR.Explanatories;

Explanatories:= methodLR.Explanatories;

Lag:= 0;

For i:= 0 To Explanatories.Count - 1 Do

If Explanatories.Item(i).Include Then

term:= terms.Item(i);

coef:= coeffs.Coefficients.Estimate[j];

If (j <> 0) And (coef >= 0) Then

builderLR.Add(" + ");

End If;

builderLR.Add(Format(coef));

builderLR.Add("*");

builderLR.Add(term.InversedExpressionText);

j:= j + 1;

End If;

End For;

 

arma:= methodLR.ARMA;

AR:= arma.OrderAR;

MA:= arma.OrderMA;

coeffAR:= arma.CoefficientsAR;

coeffMA:= arma.CoefficientsMA;

 

For i:= 0 To AR.Length - 1 Do

builderLR.Add(" + ");

r:= AR[i];

builderLR.Add("[AR(");

builderLR.Add(Format(r));

builderLR.Add(")=");

builderLR.Add(Format(arma.CoefficientsAR.Estimate[i]));

builderLR.Add("]");

End For;

 

For i:= 0 To MA.Length - 1 Do

builderLR.Add(" + ");

r:= MA[i];

builderLR.Add("[MA(");

builderLR.Add(Format(r));

builderLR.Add(")=");

builderLR.Add(Format(arma.CoefficientsMA.Estimate[i]));

builderLR.Add("]");

End For;

Return builderLR.AsString;

End Function ParseLR;

 

Shared Function GetNameWithInversion(nam: String; invers: MsInversion; inversLag: MsInversionLag): String;

Var

Res: String;

Begin

Res:= "(" + nam + ")";

Select Case invers

Case MsInversion.Log:

Res:= "ln(" + nam + ")";

Case MsInversion.DLog:

Select Case inversLag

Case MsInversionLag.PrecidingValue:

Res:= "dlogPoP(" + nam + ")";

Case MsInversionLag.PrecidingYear:

Res:= "dlogYoY(" + nam + ")";

Case MsInversionLag.EndOfPrecedingYear:

Res:= "dlogYTD(" + nam + ")";

End Select;

Case MsInversion.PCH:

Select Case inversLag

Case MsInversionLag.PrecidingValue:

Res:= "pchPoP(" + nam + ")";

Case MsInversionLag.PrecidingYear:

Res:= "pchYoY(" + nam + ")";

Case MsInversionLag.EndOfPrecedingYear:

Res:= "pchYTD(" + nam + ")";

End Select;

Case MsInversion.Diff:

Select Case inversLag

Case MsInversionLag.PrecidingValue:

Res:= "diffPoP(" + nam + ")";

Case MsInversionLag.PrecidingYear:

Res:= "diffYoY(" + nam + ")";

Case MsInversionLag.EndOfPrecedingYear:

Res:= "diffYTD(" + nam + ")";

End Select;

Case MsInversion.Normalization:

Res:= "norm(" + nam + ")";

Case MsInversion.Standardization:

Res:= "std(" + nam + ")";

End Select;

Return Res;

End Function GetNameWithInversion;

Shared Function RoundValueFromString(Value: String): String;

Var

Num: Double;

intVal: integer;

s: string;

Begin

If Integer.TryParse(Value, intVal) Then

Return Value;

End If;

If Double.TryParse(Value, Num) Then

If Double.IsNan(Num) Or Double.IsInfinity(Num) Then

Return "-";

Else

s:= CultureInfo.Current.FormatDoublePrec(Num, 4);

s:= String.Replace(s, CultureInfo.Current.ThousandSeparator, "");

s:= string.Replace(s, ",", ".");

Return s;

End If;

Else

Return Value;

End If;

End Function RoundValueFromString;

 

Function ParseCurveEstimation(Formula: IMsFormula; Coord: IMsFormulaTransformCoord = Null; Calc: IMsMethodCalculation = Null): String;

Var

stat: String;

Trend: IMsCurveEstimationTransform;

Statistics: ISummaryStatistics;

coeff: double;

coeffs: IModelCoefficients;

builder: Istringlist;

type: integer;

method: ISmCurveEstimation;

Intercept: IIntercept;

Inver: TSInversion;

InverLag: TsInversionLag;

G: string;

Begin

Trend:= Formula.Method As IMsCurveEstimationTransform;

If Calc <> Null Then

Trend.Execute(Calc, Coord);

Statistics:= Trend.Summary(Coord);

stat:= "~" + RoundValueFromString(Statistics.R2.ToString) + "~" + RoundValueFromString(Statistics.DW.ToString);

End If;

If Trend.BestDependenceForm = -1 Then

Return "";

Else

method:= Trend.StatMethod(Coord) As ISmCurveEstimation;

type:= Trend.BestDependenceForm;

coeffs:= method.DependenceForms.Item(type).ModelCoefficients;

coeff:= 0;

Intercept:= coeffs.Intercept;

builder:= New StringList.Create;

Inver:= Trend.InversionInfo.Inversion;

InverLag:= Trend.InversionInfo.InversionLag;

G:= GetNameWithInversionTS("Y", Inver, InverLag);

builder.Add(G);

builder.Add("=");

Select Case type

Case DependenceType.Linear:

builder.Add(Format(coeffs.Coefficients.Estimate[0]));

builder.Add("*T");

coeff:= coeffs.Intercept.Estimate;

builder.Add(coeff < 0? &apos;-&apos;: &apos;+&apos;);

builder.Add(Format(Math.Abs(coeff)));

Case DependenceType.Quadratic:

coeff:= coeffs.Coefficients.Estimate[1];

builder.Add(Format(coeff));

builder.Add("*T^2");

coeff:= coeffs.Coefficients.Estimate[0];

builder.Add(coeff < 0? &apos;-&apos;: &apos;+&apos;);

builder.Add(Format(Math.Abs(coeff)));

builder.Add("*T");

coeff:= Intercept.Estimate;

builder.Add(coeff < 0? &apos;-&apos;: &apos;+&apos;);

builder.Add(Format(coeff));

 

Case DependenceType.Polynomial:

coeff:= coeffs.Coefficients.Estimate[2];

builder.Add(Format(coeff));

builder.Add("*T^3");

coeff:= coeffs.Coefficients.Estimate[1];

builder.Add(coeff < 0? &apos;-&apos;: &apos;+&apos;);

builder.Add(Format(Math.Abs(coeff)));

builder.Add("*T^2");

coeff:= coeffs.Coefficients.Estimate[0];

builder.Add(coeff < 0? &apos;-&apos;: &apos;+&apos;);

builder.Add(Format(Math.Abs(coeff)));

builder.Add("*T");

coeff:= Intercept.Estimate;

builder.Add(coeff < 0? &apos;-&apos;: &apos;+&apos;);

builder.Add(Format(coeff));

 

Case DependenceType.Compound:

coeff:= coeffs.Intercept.Estimate;

If (coeff >= 0) Then

builder.Add(Format(Math.Abs(coeff)));

Else

builder.Add(&apos;(&apos;);

builder.Add(Format(Math.Abs(coeff)));

builder.Add(&apos;)&apos;);

End If;

builder.Add("*");

coeff:= coeffs.Coefficients.Estimate[0];

builder.Add(Format(Math.Abs(coeff)));

builder.Add("^T");

 

 

Case DependenceType.Growth:

builder.Add("e^(");

coeff:= coeffs.Coefficients.Estimate[0];

builder.Add(Format(Math.Abs(coeff)));

builder.Add("*T");

coeff:= Intercept.Estimate;

builder.Add(coeff < 0? &apos;-&apos;: &apos;+&apos;);

builder.Add(Format(Math.Abs(coeff)));

builder.Add(&apos;)&apos;);

 

Case DependenceType.Logarithmic:

builder.Add(Format(coeffs.Coefficients.Estimate[0]));

builder.Add("*Ln(T)");

coeff:= Intercept.Estimate;

builder.Add(coeff < 0? &apos;-&apos;: &apos;+&apos;);

builder.Add(Format(Math.Abs(coeff)));

 

Case DependenceType.Hyperbolic:

builder.Add("e^(");

builder.Add(Format(coeffs.Coefficients.Estimate[0]));

builder.Add("/T ");

coeff:= Intercept.Estimate;

builder.Add(coeff < 0? &apos;-&apos;: &apos;+&apos;);

builder.Add(Format(Math.Abs(coeff)));

builder.Add(&apos;)&apos;);

 

Case DependenceType.Exponential:

coeff:= Intercept.Estimate;

builder.Add(Format(coeff));

builder.Add("*e^(");

coeff:= (coeffs.Coefficients.Estimate[0]);

builder.Add(Format(coeff));

builder.Add("*T)");

 

Case DependenceType.Inverse:

builder.Add(Format(coeffs.Coefficients.Estimate[0]));

builder.Add("/T");

coeff:= Intercept.Estimate;

builder.Add(coeff < 0? &apos;-&apos;: &apos;+&apos;);

builder.Add(Format(Math.Abs(coeff)));

 

Case DependenceType.Power:

coeff:= Intercept.Estimate;

builder.Add(Format(coeff));

builder.Add(" * T ^ ");

coeff:= coeffs.Coefficients.Estimate[0];

If (coeff >= 0) Then

builder.Add(Format(Math.Abs(coeff)));

Else

builder.Add(&apos;(&apos;);

builder.Add(Format(coeff));

builder.Add(&apos;)&apos;);

End If;

 

Case DependenceType.Logistic:

builder.Add("1/(");

coeff:= coeffs.Coefficients.Estimate[0];

builder.Add(Format(coeff));

builder.Add("e^(-T)");

coeff:= Intercept.Estimate;

builder.Add(coeff < 0? &apos;-&apos;: &apos;+&apos;);

builder.Add(Format(Math.Abs(coeff)));

builder.Add(&apos;)&apos;);

 

Case DependenceType.SquareRoot:

builder.Add(Format(coeffs.Coefficients.Estimate[0]));

builder.Add("*sqrt(T)");

coeff:= Intercept.Estimate;

builder.Add(coeff < 0? &apos;-&apos;: &apos;+&apos;);

builder.Add(Format(Math.Abs(coeff)));

 

Case DependenceType.LogParabolic:

builder.Add("e^(");

builder.Add(Format(coeffs.Coefficients.Estimate[1]));

builder.Add("*T^2");

builder.Add(coeff < 0? &apos;-&apos;: &apos;+&apos;);

coeff:= coeffs.Coefficients.Estimate[0];

builder.Add(Format(coeffs.Coefficients.Estimate[0]));

builder.Add("*T");

builder.Add(coeff < 0? &apos;-&apos;: &apos;+&apos;);

coeff:= Intercept.Estimate;

builder.Add(Format(Math.Abs(coeff)));

builder.Add(")");

End Select;

Return builder.AsString;

End If;

End Function ParseCurveEstimation;

 

Shared Function GetNameWithInversionTS(nam: String; invers: TSInversion; inversLag: TSInversionLag): String;

Var

Res: String;

Begin

Res:= "(" + nam + ")";

Select Case invers

Case TSInversion.Log:

Res:= "ln(" + nam + ")";

Case TSInversion.DLog:

Select Case inversLag

Case TsInversionLag.PrecidingValue:

Res:= "dlogPoP(" + nam + ")";

Case TsInversionLag.PrecidingYear:

Res:= "dlogYoY(" + nam + ")";

Case TsInversionLag.EndOfPrecedingYear:

Res:= "dlogYTD(" + nam + ")";

End Select;

Case TsInversion.PCH:

Select Case inversLag

Case TsInversionLag.PrecidingValue:

Res:= "pchPoP(" + nam + ")";

Case TsInversionLag.PrecidingYear:

Res:= "pchYoY(" + nam + ")";

Case TsInversionLag.EndOfPrecedingYear:

Res:= "pchYTD(" + nam + ")";

End Select;

Case TsInversion.Diff:

Select Case inversLag

Case TsInversionLag.PrecidingValue:

Res:= "diffPoP(" + nam + ")";

Case TsInversionLag.PrecidingYear:

Res:= "diffYoY(" + nam + ")";

Case TsInversionLag.EndOfPrecedingYear:

Res:= "diffYTD(" + nam + ")";

End Select;

Case TsInversion.Normalization:

Res:= "norm(" + nam + ")";

Case TsInversion.Standardization:

Res:= "std(" + nam + ")";

End Select;

Return Res;

End Function GetNameWithInversionTS;

 

Function ParseNonLinearRegression(Formula: IMsFormula; Coord: IMsFormulaTransformCoord = Null; Calc: IMsMethodCalculation = Null): String;

Var

Res, stat: String;

Statistics: ISummaryStatistics;

NonLinearReg: IMsNonLinearRegressionTransform;

ExprStr: String;

Op: IMsFormulaTermList;

Term: IMsFormulaTerm;

curstr: String;

Cn: Integer;

i: Integer;

TermInfo: IMsFormulaTermInfo;

methodNLR: ISmNonLinearLeastSquare;

builder: Istringlist;

Begin

NonLinearReg:= Formula.Method As IMsNonLinearRegressionTransform;

If Calc <> Null Then

NonLinearReg.Identify(Calc, Coord);

Statistics:= NonLinearReg.Summary(Coord);

stat:= "~" + RoundValueFromString(Statistics.R2.ToString) + "~" + RoundValueFromString(Statistics.DW.ToString);

End If;

methodNLR:= NonLinearReg.StatMethod(Coord) As ISmNonLinearLeastSquare;

Res:= NonLinearReg.Result.TermToText;

Res:= GetNameWithInversion(Res, NonLinearReg.Inversion, NonLinearReg.InversionLag);

Res:= Res + " = ";

 

ExprStr:= NonLinearReg.Expression.AsString;

Op:= NonLinearReg.Operands;

Cn:= Op.Count;

For i:= 0 To Cn - 1 Do

Term:= Op.Item(i);

TermInfo:= Term.TermInfo;

curstr:= GetNameWithInversion(TermInfo.TermText, TermInfo.Inversion, TermInfo.InversionLag);

ExprStr:= String.Replace(ExprStr, Term.TermToInnerText, curstr);

End For;

builder:= New StringList.Create;

builder.Add(Res + ExprStr + stat);

Return builder.AsString;

End Function ParseNonLinearRegression;

 

End Class ModelsXmlGenerator;

 

//Для обработки уравнения

Public Class ModelsCallback: ProblemCalculationCallback

Public pMeta: IMsMetaModel;

Public Prob: IMetabaseObjectDescriptor;

Public bNeedDescription: Boolean;

Public LogID: Double;

Public ModelID: Integer;

Public t: integer;

Shared _Eq: IXmlDomElement;

Shared A: ArrayList;

 

Public Shared Property Eq: IXmlDomElement

Get

Begin

Return _Eq;

End Get

Set

Begin

_Eq:= value;

End Set

End Property Eq;

 

Public Sub OnError(Message: String);

Begin

//Debug.WriteLine("Ошибка: " + Message);

End Sub OnError;

 

Public Sub OnFinish;

Begin

If bNeedDescription Then

PrepareStatData;

End If;

 

End Sub OnFinish;

 

 

Sub PrepareStatData;

Var

CalculationChain: IMsCalculationChainEntries;

Chain: IMsCalculationChainEntry;

i: Integer;

Model: IMsModel;

Models: ModelsXmlGenerator;

Eq: Eqs;

Begin

CalculationChain:= pMeta.CalculationChain;

A:= New ArrayList.Create;

For i:= 0 To CalculationChain.Count - 1 Do

Chain:= CalculationChain.Item(i);

If (Chain Is IMsCalculationChainModel) Then

Model:= (Chain As IMsCalculationChainModel).Model;

Models:= New ModelsXmlGenerator.Create(Model, t, Prob);

Models.ParseModel;

A.Add(_Eq);

End If;

End For;

Eq.A:= A;

Eq:= New Eqs.Eq(Prob);

Eq.GetXMLProblem;

End Sub PrepareStatData;

 

{ Private Sub LogModelStats(pModel: IMsModel);

Var

pTrans: IMsFormulaTransform;

pFormula: IMsFormula;

pStats: ISummaryStatistics;

pCoord: IMsFormulaTransformCoord;

Outputs: IMsFormulaTransformVariable;

Slices: IMsFormulaTransformSlice;

Begin

pTrans:= pModel.Transform;

pFormula:= pTrans.FormulaItem(0);

Outputs:= pTrans.Outputs.Item(0);

pCoord:= pTrans.CreateCoord(Outputs);

pStats:= pFormula.Method.Summary(pCoord);

Slices:= Outputs.Slices.Item(0);

 

 

End Sub LogModelStats;}

 

{Public Sub OnStageStart(Stage: MsProblemCalculationStage);

Begin

Debug.WriteLine("Расчет этапа: " + Stage.ToString);

End Sub OnStageStart;

 

Public Sub OnStageFinish(Stage: MsProblemCalculationStage; Duration: Integer);

Begin

Debug.WriteLine("Расчет этапа " + Stage.ToString + " завершен");

End Sub OnStageFinish;}

Public Sub OnMessage(Message: String);

Begin

//Debug.WriteLine("Сообщение: " + Message);

End Sub OnMessage;

 

Public Sub OnModelCalculation(Model: IMsModel);

Begin

//Debug.WriteLine("Расчет модели: " + (Model As IMetabaseObject).Id);

End Sub OnModelCalculation;

 

Public Sub OnStep;

Begin

//Debug.WriteLine("Выполнен шаг расчёта");

End Sub OnStep;

 

Public Sub OnBreak(Breakpoint: IMsBreakpoint);

Begin

//Debug.WriteLine(Breakpoint.Name);

End Sub OnBreak;

 

Public Sub OnWarning(Message: string);

Begin

//Debug.WriteLine("Предупреждение: " + Message);

End Sub OnWarning;

End Class ModelsCallback;

Форма

Class Form_CopyForm: Form

bCopy: Button;

MetabaseTreeList1: MetabaseTreeList;

bCalculation: Button;

GroupBox1: GroupBox;

Label1: Label;

CheckBox1: CheckBox;

IntegerEdit1: IntegerEdit;

SaveFile: Button;

_ms: IMetabaseObjectDescriptor;

 

Sub bCopyOnClick(Sender: Object; Args: IMouseEventArgs); //Копирование

Var

copier: ModelCopier;

Begin

If Not bCopy.Enabled Then

Return;

End If;

copier:= New ModelCopier.Create(_ms, MetabaseTreeList1.SelectedObjects.Item(0));

copier.Execute;

End Sub bCopyOnClick;

 

Sub Form_CopyFormOnCreate(Sender: Object; Args: IEventArgs);

Begin

_ms:= MetabaseClass.Active.Item(Key_Box);

MetabaseTreeList1.Root:= _ms;

End Sub Form_CopyFormOnCreate;

 

Sub MetabaseTreeList1OnSelectionChanged(Sender: Object; Args: ITreeControlEventArgs);

Begin

If (MetabaseTreeList1.SelectedObjects.Count = 1) Then

bCopy.Enabled:=

MetabaseTreeList1.SelectedObjects.Item(0).ClassId = MetabaseObjectClass.KE_CLASS_MSPROBLEM;

Else

bCopy.Enabled:= False;

End If;

bCalculation.Enabled:= bCopy.Enabled;

SaveFile.Enabled:= bCopy.Enabled;

End Sub MetabaseTreeList1OnSelectionChanged;

 

{Sub GetNewObj(list: IArrayList; parent: IMsCalculationChainEntry);

Var

Chain: IMsCalculationChainEntries;

folder: IMsCalculationChainFolder;

i: integer;

Begin

If parent Is IMsCalculationChainFolder Then

folder:= parent As IMsCalculationChainFolder;

Chain:= folder.Contents;

For i:= 0 To Chain.Count - 1 Do

If Chain.Item(i) Is IMsCalculationChainFolder Then

GetNewObj(list, Chain.Item(i));

End If;

End For;

End If;

End Sub GetNewObj;}

 

Sub bCalculationOnClick(Sender: Object; Args: IMouseEventArgs); //Найти

Var

Calculation: IMsProblemCalculation;

CallBack: ModelsCallback;

CalcSettings: IMsProblemCalculationSettings;

Prob: IMsProblem;

Begin

If Not bCalculation.Enabled Then

Return;

End If;

Prob:= MetabaseTreeList1.SelectedObjects.Item(0).Bind As IMsProblem;

CalcSettings:= Prob.CreateCalculationSettings;

CalcSettings.FactIncluded:= True;

CalcSettings.BreakOnError:= True;

Calculation:= Prob.Calculate(CalcSettings);

CallBack:= New ModelsCallback.Create;

CallBack.t:= IntegerEdit1.Value;

CallBack.bNeedDescription:= CheckBox1.Checked;

CallBack.pMeta:= Prob.MetaModel;

CallBack.Prob:= MetabaseTreeList1.SelectedObjects.Item(0);

Calculation.Callback:= CallBack;

Calculation.Run;

End Sub bCalculationOnClick;

 

Sub SaveFileOnClick(Sender: Object; Args: IMouseEventArgs);

Var

Create: WriteFile;

Begin

If Not SaveFile.Enabled Then

Return;

End If;

Create:= New WriteFile.Create(MetabaseTreeList1.SelectedObjects.Item(0));

Create.CreateDoc;

End Sub SaveFileOnClick;

 

End Class Form_CopyForm;

 

Создание XML

Enum SummaryStatistics

R2, AdjR2, Fstat, ProbFstat, DW, AdjR2_2, AIC, AvgLogL, DWLowerBound

, DWUpperBound, Fstat_2, HQcriterion, IncludedObservations, Jstat, LogL

, LRprobability, LRstatistic, MAE, MaxAE, McFaddenRsquared, MD

, ME, MSE, NumOfIter, ProbFstat_2, ProbJstat, R2_2

, RestrLogL, SC, SD, SE, SEE, SqMSE, SSR, VE

End Enum SummaryStatistics;

Enum ModelType

LR, Trend, NLR

End Enum ModelType;

Enum Type

SVar, Ovar, factor //SVar-моделируемая переменная,Ovar-исходная переменная

End Enum Type;

Public Class Eqs: Object

Shared _Mode: IMsModel;

_Formula: IMsFormula;

_MFormula: String;

_Coord: IMsFormulaTransformCoord;

Doc: IXmlDomElement;

_Prob: IMetabaseObjectDescriptor;

P, Trend, NRL, RL: string;

PName, PeriodInd, PeriodPrognoz: String;

PKey: integer;

NameStat: String;

coeffs: IModelCoefficients;

Stat: IDependenceForm;

FModel: String;

FEqs: String;

FEq: String;

FFactors: String;

FFactor: String;

FStatistics: String;

FItem: String;

Shared _T: integer;

Shared _A: ArrayList;

 

Public Shared Property A: ArrayList

Get

Begin

Return _A;

End Get

Set

Begin

_A:= value;

End Set

End Property A;

 

Public Constructor Eq(Prob: IMetabaseObjectDescriptor);

Begin

_Prob:= Prob;

End Constructor Eq;

 

Public Constructor Models(Model: IMsModel; Formula: IMsFormula; MFormula: String; Coord: IMsFormulaTransformCoord; T: integer);

Begin

_mode:= Model;

_Formula:= Formula;

_MFormula:= MFormula;

_Coord:= Coord;

_T:= T;

End Constructor Models;

 



Поделиться:


Последнее изменение этой страницы: 2017-01-19; просмотров: 444; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.133.108.241 (0.931 с.)