![]() |
|
Модераторы: bsa |
![]()
|
|
| Shadowlord |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 275 Регистрация: 28.11.2006 Репутация: нет Всего: 5 |
Пишу программу для симпелекс метода минимизации функций многих переменных, вот алгоритм
http://sapr.mgsu.ru/biblio/optimiz/m7.htm Так вот основная проблема как организовать ввод пользователем этой функции и потом проанализировать ее. Это сообщение отредактировал(а) Shadowlord - 7.6.2009, 10:50 |
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Самый простой метод - забить функцию в программу.
Самый сложный метод - сделать интерпретатор (или JIT) для вычисления функции Средний по сложности метод - обернуть функцию в специальный врапер, сгенерировать из этого отдельный С файл, откомпилировать его в виде динамической библиотеки, динамически загрузить к себе в программу |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 6 Всего: 26 |
если функция линейная - вводи ее коэффициенты
Это сообщение отредактировал(а) GoldFinch - 8.6.2009, 17:39 |
|||
|
||||
| Shadowlord |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 275 Регистрация: 28.11.2006 Репутация: нет Всего: 5 |
функция может быть не линейной , в этом и есть основная проблема
|
|||
|
||||
| Shadowlord |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 275 Регистрация: 28.11.2006 Репутация: нет Всего: 5 |
xvr, можно чуть по подробней про средний метод
|
|||
|
||||
| kamre |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 330 Регистрация: 24.3.2006 Репутация: 2 Всего: 13 |
Почему интерпретатор (без всяких там JIT) самый сложный? Мне кажется это достаточно стандартная задачка, что-то вроде калькулятора. А с генерацией файла, компиляцией и динамической загрузкой - это какой-то "извращенный" способ |
|||
|
||||
| xvr |
|
||||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Можно. Например, пользователь вводит функцию в файле в таком виде:
Система генерит файл следующего содержания (wrap.cpp)
Т.к. прототип функции известен и фиксирован, то ее можно вызвать одним и тем же способом, вне зависимости от того, что в нее напишет пользователь kamre:
Пример - Xilinx, ISE (среда программирования для их FPGA/CPLD), ихний симулятор (симулирует программы на Verilog & VHDL). Бесплатная и коммерческая версия отличаются только файлом лицензии. Симулятор преобразует исходный код в программу на C++, и компилирует ее вместе со своими библиотеками в exe (gcc входит в состав дистрибутива ISE). Полученный exe запускают под оболочкой симулятора. |
||||||||||||
|
|||||||||||||
| Shadowlord |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 275 Регистрация: 28.11.2006 Репутация: нет Всего: 5 |
Вот нашел Парсер математических выражений (http://www.rsdn.ru/article/files/Classes/tparser.xml)
выдает ошибку
вот строка на которую ругается
Не могу понять в чем проблема |
||||
|
|||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Проблема в функции exp из math.h. Видимо где то нашлась еще одна
Напишите так
|
|||
|
||||
| Shadowlord |
|
||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 275 Регистрация: 28.11.2006 Репутация: нет Всего: 5 |
Вот еще вопрос
я создал массив
Запомнил его из грида
Хочу запихать его в парсер как значение переменных а он мне говорит что типы не совпадают
как его привести к double * |
||||||
|
|||||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Правильно говорит - массив должен быть обычный (double*), а не array и уж тем более не .net'овский указатель.
Делайте так
|
|||
|
||||
| Shadowlord |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 275 Регистрация: 28.11.2006 Репутация: нет Всего: 5 |
Еще один вопрос, для расчетов нужно хранить вершины симплекса и их координаты являются значениями переменных по которым считается функция. Я хочу использовать для этого динамический двумерный массив, строка набор координат вершин, что б потом построчно скармливать их парсеру и находить значение в каждой из вершин.
Так вот я не могу описать этот самый масивв(если не ошибаюсь должен получится массив указателе ) Добавлено через 11 минут и 6 секунд сделал так вроде каботает
|
|||
|
||||
| xvr |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
В строке в new double[] нужно указать размер массива по 2му измерению (пусть будет k), а не i
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |