Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Расчет затрат на проектирование системыСтр 1 из 3Следующая ⇒
ВВЕДЕНИЕ В данной выпускной квалификационной работе рассматривается Разработка программного модуля для сохранения данных задачи моделирования. Актуальность выбранной темы определяется требованиями заказчика. Целью квалификационной работы является разработать программный модуль, который позволит сохранять полученные результаты задачи моделирования в 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, и других (см. ниже). Программирование для начинающих.
Для данного программного модуля был выбран объектно-ориентированный язык программирования 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. – Трудоемкость работы исполнителей
Руководитель проекта следит за проектированием и разработкой приложения, внедрением приложения. В сферу деятельности аналитика входит исследование предметной области, разработка пред проектных решений, разработка технического задания, разработка проектных решений, анализ экономической эффективности и исследование безопасных условий при работе проектируемой системы. Программист занимается написанием программного модуля для предприятия и отладкой. Для определения амортизационных отчислений сведем в таблицу 2 используемое оборудование и программное обеспечение (ПО), используемое при проектировании системы. Таблица 2. – Используемое оборудование и ПО для проектирования системы
Ниже определим исходные данные для расчета затрат на внедрение системы. При внедрении систем учитываются трудозатраты сотрудников, осуществляющих работы, а также затраты на оборудование, комплектующие, материалы и специальное программное обеспечение, позволяющее физически реализовать и обеспечить качество системы. Они показаны в таблице 3.
Таблица 3. – Затраты на внедрение системы
Определим нормы затрат (% берется от основной ставки: зар.платы, стоимости оборудования и т.д.): - норма дополнительной заработной платы – 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? '-': '+'); 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? '-': '+'); builder.Add(Format(Math.Abs(coeff))); builder.Add("*T"); coeff:= Intercept.Estimate; builder.Add(coeff < 0? '-': '+'); 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? '-': '+'); builder.Add(Format(Math.Abs(coeff))); builder.Add("*T^2"); coeff:= coeffs.Coefficients.Estimate[0]; builder.Add(coeff < 0? '-': '+'); builder.Add(Format(Math.Abs(coeff))); builder.Add("*T"); coeff:= Intercept.Estimate; builder.Add(coeff < 0? '-': '+'); builder.Add(Format(coeff));
Case DependenceType.Compound: coeff:= coeffs.Intercept.Estimate; If (coeff >= 0) Then builder.Add(Format(Math.Abs(coeff))); Else builder.Add('('); builder.Add(Format(Math.Abs(coeff))); builder.Add(')'); 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? '-': '+'); builder.Add(Format(Math.Abs(coeff))); builder.Add(')');
Case DependenceType.Logarithmic: builder.Add(Format(coeffs.Coefficients.Estimate[0])); builder.Add("*Ln(T)"); coeff:= Intercept.Estimate; builder.Add(coeff < 0? '-': '+'); 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? '-': '+'); builder.Add(Format(Math.Abs(coeff))); builder.Add(')');
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? '-': '+'); 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('('); builder.Add(Format(coeff)); builder.Add(')'); 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? '-': '+'); builder.Add(Format(Math.Abs(coeff))); builder.Add(')');
Case DependenceType.SquareRoot: builder.Add(Format(coeffs.Coefficients.Estimate[0])); builder.Add("*sqrt(T)"); coeff:= Intercept.Estimate; builder.Add(coeff < 0? '-': '+'); 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? '-': '+'); coeff:= coeffs.Coefficients.Estimate[0]; builder.Add(Format(coeffs.Coefficients.Estimate[0])); builder.Add("*T"); builder.Add(coeff < 0? '-': '+'); 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 с.) |