1 страниц (17 вхождений)
Метод Рунге-Кутта - Сообщения
#1 Опубликовано: 04.06.2009 20:06:08
#2 Опубликовано: 05.06.2009 06:59:50
Oйлер и Рунге-Кутта на MAS
http://twt.mpei.ac.ru/mas/worksheets/Euler.mcd
http://twt.mpei.ac.ru/mas/worksheets/Euler.mcd
#3 Опубликовано: 05.06.2009 14:39:24
WroteНе могу понять, функции могут быть в качестве операндов пользовательской функции?
Не уверен, что понял вопрос. Если речь идёт о том, можно ли функции передовать через аргументы других функций, то да:
[live width=250 height=110]http://smath.info/live/?file=372[/live]
WroteЕсли ли аналог stack()?
Нет.
WroteМожно ли использовать один индекс при доступе к вектор-столбцу?
Пока нет.
#4 Опубликовано: 06.06.2009 02:47:54
#5 Опубликовано: 06.06.2009 02:55:39
#6 Опубликовано: 07.06.2009 20:25:57
Ой, только не надо превращать SMath в инструмент показа программистских фокусов. Хотя я сам их очень люблю и много на своем веку напридумывал...
#7 Опубликовано: 08.06.2009 06:13:13
Тут нет никаких программистских фокусов. Автору, как программисту, интересно внутреннее устройство аналогичных программ. На картинке приведён пример как численный движок работает с набором функций как целым. Это не трюк и не фокус, а вполне нормальное поведение программы - ожидаемое. Без этого "фокуса" прожить в принципе можно, но написанный Томом Гутманом интерпретатор строковых выражений уже не заработает, т.к. основан именно на нём.
В последних картинках тоже нет каких особых приёмов для тех, кто умеет пользоваться Maple. Не всегда там ясно какого типа получился результат преобразования, а без этого нельзя осознанно применять функции к этому результату, иначе теряется контроль над вычислительным процессом.
Если хотите whattype() - это элемент отладки программ, написанных в Maple.
Я всё склоняю автора к мысли, чтобы оставить один символьный движок, в котором численные расчёты были бы как составная часть. Внешне же можно сделать интерфейс аля Mathcad. Если бы Mathsoft имела в штате спецов по символьным вычислениям, то, я думаю, что они бы давно так и сделали, а не тянули бы за собой переходники-интерфейсы с символьными движками.
Символьные вычисления - это множество, которое включает в себя численные вычисления с точки зрения программирования. Это можно сравнить с языками С и С++. С - это "численные вычисления", а С++ - это "символьные вычисления". На С не сделать простым образом конструкции, упрощающие рутину, которые само собой разумеющиеся на С++. Я говорю про классы. Умелое их использование упрощает программирование. Они для этого и созданы. Это язык следующего поколения по сравнению с С.
Сегодняшние студенты, школьники без проблем осваивают новые технологии, казавшиеся чем-то сложным предыдущему поколению. Для них С++ - это как когда-то ассемблер для гуру лет 30 назад.
Так вот, в символьных вычислениях нет ничего особенного. Это просто следующее поколение вычислителей (компьютерной алгебры) по сравнению с "инженерными калькуляторами". В них само собой разумеющееся делать конструкции, которые раньше в численных движках сделать было не возможно - только запрограммировать подключаемый модуль. Прогресс не стоит на месте. Его надо использовать.
П.С. Вообще передача указателя функции как параметра была простой операцией на C и C++, в C# же так просто вроде бы это не сделать, т.к. манипуляции с указателями считаются опасными операциями. Я уже давно не программировал и не помню можно ли там во время выполнения подобным или другим образом работать с указателями на функцию.
Трудно ориентироваться в возможностях и правилах языка, когда нет его описания.
В последних картинках тоже нет каких особых приёмов для тех, кто умеет пользоваться Maple. Не всегда там ясно какого типа получился результат преобразования, а без этого нельзя осознанно применять функции к этому результату, иначе теряется контроль над вычислительным процессом.
Если хотите whattype() - это элемент отладки программ, написанных в Maple.
Я всё склоняю автора к мысли, чтобы оставить один символьный движок, в котором численные расчёты были бы как составная часть. Внешне же можно сделать интерфейс аля Mathcad. Если бы Mathsoft имела в штате спецов по символьным вычислениям, то, я думаю, что они бы давно так и сделали, а не тянули бы за собой переходники-интерфейсы с символьными движками.
Символьные вычисления - это множество, которое включает в себя численные вычисления с точки зрения программирования. Это можно сравнить с языками С и С++. С - это "численные вычисления", а С++ - это "символьные вычисления". На С не сделать простым образом конструкции, упрощающие рутину, которые само собой разумеющиеся на С++. Я говорю про классы. Умелое их использование упрощает программирование. Они для этого и созданы. Это язык следующего поколения по сравнению с С.
Сегодняшние студенты, школьники без проблем осваивают новые технологии, казавшиеся чем-то сложным предыдущему поколению. Для них С++ - это как когда-то ассемблер для гуру лет 30 назад.
Так вот, в символьных вычислениях нет ничего особенного. Это просто следующее поколение вычислителей (компьютерной алгебры) по сравнению с "инженерными калькуляторами". В них само собой разумеющееся делать конструкции, которые раньше в численных движках сделать было не возможно - только запрограммировать подключаемый модуль. Прогресс не стоит на месте. Его надо использовать.
П.С. Вообще передача указателя функции как параметра была простой операцией на C и C++, в C# же так просто вроде бы это не сделать, т.к. манипуляции с указателями считаются опасными операциями. Я уже давно не программировал и не помню можно ли там во время выполнения подобным или другим образом работать с указателями на функцию.
Трудно ориентироваться в возможностях и правилах языка, когда нет его описания.
Россия навсегда!
Вячеслав Мезенцев
#8 Опубликовано: 08.06.2009 08:59:52
уни, согласен. Работа с указателями на функции позволит придать гибкости. Единственное что смущает, так это то, что таким образом при создании функции F само имя F резервируется и декларировать пользовательскую переменную ниже без последствий становится невозможно.
Вечером-ночью поэкспериментирую в эту сторону и вернусь сюда с дополнительной информацией и/или вопросами.
Вечером-ночью поэкспериментирую в эту сторону и вернусь сюда с дополнительной информацией и/или вопросами.
#9 Опубликовано: 08.06.2009 11:08:12
Конкретный приём, который мне нужен в этом топике - это передача функции в качестве параметра. Дело в том, что в данной реализации метода Рунге-Кутта система диффуров передаётся внутрь программы как функция-вектор или набор функций. Мне нужно имя этой системы внутри программы, чтобы использовать векторные операции так как-будто я пользуюсь простыми переменными-скалярами. Здесь мы не зависим от размерности вектора системы. Этот размер "скрыт" в коде программы. Это очень удобно закодированный метод. Если хотя бы его реализовать, то откроются интересные возможности 
В частности и решение СНУ.
Вот пример реализации этого же алгоритма на Дельфи: http://sintreseng.narod.ru/others.htm
Runge-Kutt Method v.2.00
П.С. Если, кстати, этот метод интересно будет добавить в текущую встроенную численную библиотечку, то я могу написать аналог маткадовского rkfixed().

В частности и решение СНУ.
Вот пример реализации этого же алгоритма на Дельфи: http://sintreseng.narod.ru/others.htm
Runge-Kutt Method v.2.00
П.С. Если, кстати, этот метод интересно будет добавить в текущую встроенную численную библиотечку, то я могу написать аналог маткадовского rkfixed().
Россия навсегда!
Вячеслав Мезенцев
#10 Опубликовано: 09.06.2009 10:05:37
Так и не дошли руки до экспериментов, попробую найти время сегодня.
Было бы здорово! Что нужно для этого с нашей стороны?
WroteП.С. Если, кстати, этот метод интересно будет добавить в текущую встроенную численную библиотечку, то я могу написать аналог маткадовского rkfixed().
Было бы здорово! Что нужно для этого с нашей стороны?
#11 Опубликовано: 09.06.2009 10:56:12
Для этого нужна "рыба", т.е. заготовка. Посмотрите на эту функцию в Mathcad, она принимает несколько параметров:
Мне нужен пример какой-нить функции из Вашей численной библиотечки и декларация функции в соответствии с Вашими типами.
Описание переменных с точки зрения программирования:
y - это вектор-столбец - начальная точка;
x1, x2, npoints - скаляры;
D(t, x) - это функция от двух переменных, результат которой вектор-столбец значений. Эту функцию задаёт пользователь. x - это тоже вектор-столбец, а t - скаляр.
Это если в точности следовать маткадовскому описанию. Внутри в коде я буду вызывать D(t, x) немного меняя х. Вот не знаю возможно ли это у Вас сделать.
Функция возвращает матрицу.
Вот пример описания на Паскале:
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; // возвращаемое значение - код ошибки
Россия навсегда!
Вячеслав Мезенцев
#12 Опубликовано: 09.06.2009 12:11:11
Хорошо. Получается, что возможность реализации упирается в отсутствие механизма передачи указателя функции. Сделаю и сразу сообщу об этом.
#13 Опубликовано: 09.06.2009 13:34:15
Указатель в Win32API был мягко говоря "нетипизированным", т.е. можно было запросто преобразовать один тип указателя в другой, т.к. указатель суть 4 байта. Вам же, на мой взгляд, нужно ввести класс - указатель на функцию, причём, функция не с точки зрения языковой конструкции, а опять же класс SMath, т.е. своё собственное представление о механизме работы с функциями. Т.о. у Вас, мне так думается, указатель - это номер в массиве выражений всего листа. Что-то в этом духе.
Как что-нить получится, попробуйте простую операцию: Function(F; x) := F(x). Только Function() - это функция численной библиотечки.
Как что-нить получится, попробуйте простую операцию: Function(F; x) := F(x). Только Function() - это функция численной библиотечки.
Россия навсегда!
Вячеслав Мезенцев
#14 Опубликовано: 20.03.2010 06:43:12
Есть успехи в передаче функций внутрь плагинов?
Россия навсегда!
Вячеслав Мезенцев
#15 Опубликовано: 13.10.2010 08:05:37
#16 Опубликовано: 13.10.2010 08:24:36
Приветствую!
Можно воспользоваться функцией eval, чтобы проводить вычисления без использования символьной библиотеки - выигрыш ощутимый. Пример можно посмотреть здесь.
Это бага - исправлю.
Также теперь можно передавать функцию как аргумент:
[LIVE width=529 height=266]http://smath.info/live/?file=1269[/LIVE]
P.S.: Судя по тому, как отображается функция line на скриншоте Вы используете не последнюю доступную версию SMath Studio - рекомендую использовать последнюю бету 0.89.8 (она себя хорошо зарекомендовала).
С уважением.
WroteКак заставить это работать быстро
Можно воспользоваться функцией eval, чтобы проводить вычисления без использования символьной библиотеки - выигрыш ощутимый. Пример можно посмотреть здесь.
WroteСтранно работает stack. При составлении скаляра и вектора получается составной массив вместо вектора большего размера.
Это бага - исправлю.
WroteВижу, что успехи есть.
Также теперь можно передавать функцию как аргумент:
[LIVE width=529 height=266]http://smath.info/live/?file=1269[/LIVE]
P.S.: Судя по тому, как отображается функция line на скриншоте Вы используете не последнюю доступную версию SMath Studio - рекомендую использовать последнюю бету 0.89.8 (она себя хорошо зарекомендовала).
С уважением.
#17 Опубликовано: 13.10.2010 10:54:38
Да, это работает. Когда исправите stack() сделаю по аналогии для любой размерности задачи (как в Mathcad'е).

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

Эту функцию можно назвать rk4fixed().
П.С.
Думаю, что можно уже попробовать реализовать implicitplot2d() как в Mathcad'е.
Похоже, что с augment() та же история.
Россия навсегда!
Вячеслав Мезенцев
1 страниц (17 вхождений)
-
Новые сообщения
-
Нет новых сообщений