Русскоязычный форум закрыт из-за отсутствия активности (доступен только для чтения).
Пожалуйста, пользуйтесь англоязычной его версией. Приносим извинения за неудобства
Добро пожаловать, Гость! Чтобы использовать все возможности Вход. Новые регистрации запрещены.

Уведомление

Icon
Error

Вход


Опции
К последнему сообщению К первому непрочитанному
Offline уни  
#1 Оставлено : 5 июня 2009 г. 3:06:08(UTC)
уни


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 02.06.2009(UTC)
Сообщений: 346
Мужчина
Российская Федерация

Сказал «Спасибо»: 50 раз
Поблагодарили: 156 раз в 105 постах
Хочу перевести простую программку с Mathcad'а:


Не могу понять, функции могут быть в качестве операндов пользовательской функции?
Если ли аналог stack()?
Можно ли использовать один индекс при доступе к вектор-столбцу?
Россия навсегда!
Вячеслав Мезенцев

Wanna join the discussion?! Login to your Форум проекта SMath forum account. Новые регистрации запрещены.

Offline OchkovVF  
#2 Оставлено : 5 июня 2009 г. 13:59:50(UTC)
OchkovVF


Статус: Advanced Member

Группы: Registered, Advanced Member
Зарегистрирован: 03.06.2009(UTC)
Сообщений: 156
Мужчина
Российская Федерация

Сказал «Спасибо»: 215 раз
Поблагодарили: 3 раз в 3 постах
Oйлер и Рунге-Кутта на MAS
twt.mpei.ac.ru/mas/worksheets/Euler.mcd
Offline smath  
#3 Оставлено : 5 июня 2009 г. 21:39:24(UTC)
smath


Статус: Administration

Группы: Developers, Registered, Knovel Developers, Administrators, Advanced Member
Зарегистрирован: 11.07.2008(UTC)
Сообщений: 912
Мужчина
Российская Федерация

Сказал «Спасибо»: 640 раз
Поблагодарили: 262 раз в 102 постах
уни написал:
Не могу понять, функции могут быть в качестве операндов пользовательской функции?

Не уверен, что понял вопрос. Если речь идёт о том, можно ли функции передовать через аргументы других функций, то да:
Открыть в Облаке SMath
уни написал:
Если ли аналог stack()?

Нет.
уни написал:
Можно ли использовать один индекс при доступе к вектор-столбцу?

Пока нет.

Отредактировано пользователем 6 июня 2009 г. 10:27:49(UTC)  | Причина: Не указана

Offline уни  
#4 Оставлено : 6 июня 2009 г. 9:47:54(UTC)
уни


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 02.06.2009(UTC)
Сообщений: 346
Мужчина
Российская Федерация

Сказал «Спасибо»: 50 раз
Поблагодарили: 156 раз в 105 постах
Вот так:


Имелась в виду неявная передача указателя на функцию в качестве параметра.

Отредактировано пользователем 6 июня 2009 г. 9:49:37(UTC)  | Причина: Не указана

Россия навсегда!
Вячеслав Мезенцев
Offline уни  
#5 Оставлено : 6 июня 2009 г. 9:55:39(UTC)
уни


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 02.06.2009(UTC)
Сообщений: 346
Мужчина
Российская Федерация

Сказал «Спасибо»: 50 раз
Поблагодарили: 156 раз в 105 постах
Можно показать даже больше:

Тут "просвечивается" внутренняя кухня Mathcad. whattype() - это maple'овская функция, показывающая тип операнда.
Россия навсегда!
Вячеслав Мезенцев
Offline OchkovVF  
#6 Оставлено : 8 июня 2009 г. 3:25:57(UTC)
OchkovVF


Статус: Advanced Member

Группы: Registered, Advanced Member
Зарегистрирован: 03.06.2009(UTC)
Сообщений: 156
Мужчина
Российская Федерация

Сказал «Спасибо»: 215 раз
Поблагодарили: 3 раз в 3 постах
Ой, только не надо превращать SMath в инструмент показа программистских фокусов. Хотя я сам их очень люблю и много на своем веку напридумывал...
Offline уни  
#7 Оставлено : 8 июня 2009 г. 13:13:13(UTC)
уни


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 02.06.2009(UTC)
Сообщений: 346
Мужчина
Российская Федерация

Сказал «Спасибо»: 50 раз
Поблагодарили: 156 раз в 105 постах
Тут нет никаких программистских фокусов. Автору, как программисту, интересно внутреннее устройство аналогичных программ. На картинке приведён пример как численный движок работает с набором функций как целым. Это не трюк и не фокус, а вполне нормальное поведение программы - ожидаемое. Без этого "фокуса" прожить в принципе можно, но написанный Томом Гутманом интерпретатор строковых выражений уже не заработает, т.к. основан именно на нём.
В последних картинках тоже нет каких особых приёмов для тех, кто умеет пользоваться Maple. Не всегда там ясно какого типа получился результат преобразования, а без этого нельзя осознанно применять функции к этому результату, иначе теряется контроль над вычислительным процессом.
Если хотите whattype() - это элемент отладки программ, написанных в Maple.
Я всё склоняю автора к мысли, чтобы оставить один символьный движок, в котором численные расчёты были бы как составная часть. Внешне же можно сделать интерфейс аля Mathcad. Если бы Mathsoft имела в штате спецов по символьным вычислениям, то, я думаю, что они бы давно так и сделали, а не тянули бы за собой переходники-интерфейсы с символьными движками.
Символьные вычисления - это множество, которое включает в себя численные вычисления с точки зрения программирования. Это можно сравнить с языками С и С++. С - это "численные вычисления", а С++ - это "символьные вычисления". На С не сделать простым образом конструкции, упрощающие рутину, которые само собой разумеющиеся на С++. Я говорю про классы. Умелое их использование упрощает программирование. Они для этого и созданы. Это язык следующего поколения по сравнению с С.
Сегодняшние студенты, школьники без проблем осваивают новые технологии, казавшиеся чем-то сложным предыдущему поколению. Для них С++ - это как когда-то ассемблер для гуру лет 30 назад.
Так вот, в символьных вычислениях нет ничего особенного. Это просто следующее поколение вычислителей (компьютерной алгебры) по сравнению с "инженерными калькуляторами". В них само собой разумеющееся делать конструкции, которые раньше в численных движках сделать было не возможно - только запрограммировать подключаемый модуль. Прогресс не стоит на месте. Его надо использовать.

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

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

Отредактировано пользователем 8 июня 2009 г. 13:25:33(UTC)  | Причина: Не указана

Россия навсегда!
Вячеслав Мезенцев
Offline smath  
#8 Оставлено : 8 июня 2009 г. 15:59:52(UTC)
smath


Статус: Administration

Группы: Developers, Registered, Knovel Developers, Administrators, Advanced Member
Зарегистрирован: 11.07.2008(UTC)
Сообщений: 912
Мужчина
Российская Федерация

Сказал «Спасибо»: 640 раз
Поблагодарили: 262 раз в 102 постах
уни, согласен. Работа с указателями на функции позволит придать гибкости. Единственное что смущает, так это то, что таким образом при создании функции F само имя F резервируется и декларировать пользовательскую переменную ниже без последствий становится невозможно.

Вечером-ночью поэкспериментирую в эту сторону и вернусь сюда с дополнительной информацией и/или вопросами.
Offline уни  
#9 Оставлено : 8 июня 2009 г. 18:08:12(UTC)
уни


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 02.06.2009(UTC)
Сообщений: 346
Мужчина
Российская Федерация

Сказал «Спасибо»: 50 раз
Поблагодарили: 156 раз в 105 постах
Конкретный приём, который мне нужен в этом топике - это передача функции в качестве параметра. Дело в том, что в данной реализации метода Рунге-Кутта система диффуров передаётся внутрь программы как функция-вектор или набор функций. Мне нужно имя этой системы внутри программы, чтобы использовать векторные операции так как-будто я пользуюсь простыми переменными-скалярами. Здесь мы не зависим от размерности вектора системы. Этот размер "скрыт" в коде программы. Это очень удобно закодированный метод. Если хотя бы его реализовать, то откроются интересные возможности Good
В частности и решение СНУ.

Вот пример реализации этого же алгоритма на Дельфи: http://sintreseng.narod.ru/others.htm
Runge-Kutt Method v.2.00

П.С. Если, кстати, этот метод интересно будет добавить в текущую встроенную численную библиотечку, то я могу написать аналог маткадовского rkfixed().

Отредактировано пользователем 8 июня 2009 г. 18:11:48(UTC)  | Причина: Не указана

Россия навсегда!
Вячеслав Мезенцев
Offline smath  
#10 Оставлено : 9 июня 2009 г. 17:05:37(UTC)
smath


Статус: Administration

Группы: Developers, Registered, Knovel Developers, Administrators, Advanced Member
Зарегистрирован: 11.07.2008(UTC)
Сообщений: 912
Мужчина
Российская Федерация

Сказал «Спасибо»: 640 раз
Поблагодарили: 262 раз в 102 постах
Так и не дошли руки до экспериментов, попробую найти время сегодня.
уни написал:
П.С. Если, кстати, этот метод интересно будет добавить в текущую встроенную численную библиотечку, то я могу написать аналог маткадовского rkfixed().

Было бы здорово! Что нужно для этого с нашей стороны?
Offline уни  
#11 Оставлено : 9 июня 2009 г. 17:56:12(UTC)
уни


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 02.06.2009(UTC)
Сообщений: 346
Мужчина
Российская Федерация

Сказал «Спасибо»: 50 раз
Поблагодарили: 156 раз в 105 постах
Для этого нужна "рыба", т.е. заготовка. Посмотрите на эту функцию в Mathcad, она принимает несколько параметров:
Код:
rkfixed(y, x1, x2, npoints, D)

Мне нужен пример какой-нить функции из Вашей численной библиотечки и декларация функции в соответствии с Вашими типами.

Описание переменных с точки зрения программирования:
y - это вектор-столбец - начальная точка;
x1, x2, npoints - скаляры;
D(t, x) - это функция от двух переменных, результат которой вектор-столбец значений. Эту функцию задаёт пользователь. x - это тоже вектор-столбец, а t - скаляр.
Это если в точности следовать маткадовскому описанию. Внутри в коде я буду вызывать D(t, x) немного меняя х. Вот не знаю возможно ли это у Вас сделать.

Функция возвращает матрицу.

Вот пример описания на Паскале:
Код:
Function Runge_Kutt(  // метод Рунге-Кутта
        FunArray: TFunArray; // массив функций
        First: Extended; // начальная точка по независимой координате
        Last: Extended; // конечная точка по независимой координате
        Steps: Integer; // число шагов по независимой координате
        InitArray: TInitArray; // вектор начальных значений
        var Res: TResArray // матрица результатов включая независ. переменную
         ):Word; // возвращаемое значение - код ошибки

Отредактировано пользователем 9 июня 2009 г. 18:00:29(UTC)  | Причина: Не указана

Россия навсегда!
Вячеслав Мезенцев
Offline smath  
#12 Оставлено : 9 июня 2009 г. 19:11:11(UTC)
smath


Статус: Administration

Группы: Developers, Registered, Knovel Developers, Administrators, Advanced Member
Зарегистрирован: 11.07.2008(UTC)
Сообщений: 912
Мужчина
Российская Федерация

Сказал «Спасибо»: 640 раз
Поблагодарили: 262 раз в 102 постах
Хорошо. Получается, что возможность реализации упирается в отсутствие механизма передачи указателя функции. Сделаю и сразу сообщу об этом.

Отредактировано пользователем 9 июня 2009 г. 19:14:09(UTC)  | Причина: Не указана

Offline уни  
#13 Оставлено : 9 июня 2009 г. 20:34:15(UTC)
уни


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 02.06.2009(UTC)
Сообщений: 346
Мужчина
Российская Федерация

Сказал «Спасибо»: 50 раз
Поблагодарили: 156 раз в 105 постах
Указатель в Win32API был мягко говоря "нетипизированным", т.е. можно было запросто преобразовать один тип указателя в другой, т.к. указатель суть 4 байта. Вам же, на мой взгляд, нужно ввести класс - указатель на функцию, причём, функция не с точки зрения языковой конструкции, а опять же класс SMath, т.е. своё собственное представление о механизме работы с функциями. Т.о. у Вас, мне так думается, указатель - это номер в массиве выражений всего листа. Что-то в этом духе.
Как что-нить получится, попробуйте простую операцию: Function(F; x) := F(x). Только Function() - это функция численной библиотечки.
Россия навсегда!
Вячеслав Мезенцев
Offline уни  
#14 Оставлено : 20 марта 2010 г. 12:43:12(UTC)
уни


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 02.06.2009(UTC)
Сообщений: 346
Мужчина
Российская Федерация

Сказал «Спасибо»: 50 раз
Поблагодарили: 156 раз в 105 постах
Есть успехи в передаче функций внутрь плагинов?
Россия навсегда!
Вячеслав Мезенцев
Offline уни  
#15 Оставлено : 13 октября 2010 г. 15:05:37(UTC)
уни


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 02.06.2009(UTC)
Сообщений: 346
Мужчина
Российская Федерация

Сказал «Спасибо»: 50 раз
Поблагодарили: 156 раз в 105 постах
Вижу, что успехи есть.

Как заставить это работать быстро и для произвольной размерности:


Странно работает stack. При составлении скаляра и вектора получается составной массив вместо вектора большего размера.
Это фича, баг или отличие от Mathcad'а? Good
Россия навсегда!
Вячеслав Мезенцев
Offline smath  
#16 Оставлено : 13 октября 2010 г. 15:24:36(UTC)
smath


Статус: Administration

Группы: Developers, Registered, Knovel Developers, Administrators, Advanced Member
Зарегистрирован: 11.07.2008(UTC)
Сообщений: 912
Мужчина
Российская Федерация

Сказал «Спасибо»: 640 раз
Поблагодарили: 262 раз в 102 постах
Приветствую!

уни написал:
Как заставить это работать быстро

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

уни написал:
Странно работает stack. При составлении скаляра и вектора получается составной массив вместо вектора большего размера.

Это бага - исправлю.

уни написал:
Вижу, что успехи есть.

Также теперь можно передавать функцию как аргумент:
Открыть в Облаке SMath

P.S.: Судя по тому, как отображается функция line на скриншоте Вы используете не последнюю доступную версию SMath Studio - рекомендую использовать последнюю бету 0.89.8 (она себя хорошо зарекомендовала).

С уважением.

Отредактировано пользователем 13 октября 2010 г. 15:30:35(UTC)  | Причина: Не указана

Offline уни  
#17 Оставлено : 13 октября 2010 г. 17:54:38(UTC)
уни


Статус: Advanced Member

Группы: Registered
Зарегистрирован: 02.06.2009(UTC)
Сообщений: 346
Мужчина
Российская Федерация

Сказал «Спасибо»: 50 раз
Поблагодарили: 156 раз в 105 постах
Да, это работает. Когда исправите stack() сделаю по аналогии для любой размерности задачи (как в Mathcad'е).


Эту функцию можно назвать rk4fixed().

П.С.
Думаю, что можно уже попробовать реализовать implicitplot2d() как в Mathcad'е.
Похоже, что с augment() та же история.

Отредактировано пользователем 13 октября 2010 г. 20:22:34(UTC)  | Причина: Не указана

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