Метод Рунге-Кутта

Метод Рунге-Кутта - Сообщения

#1 Опубликовано: 04.06.2009 20:06:08
уни

уни

156 сообщений из 355 понравились пользователям.

Группа: User

Хочу перевести простую программку с Mathcad'а:


Не могу понять, функции могут быть в качестве операндов пользовательской функции?
Если ли аналог stack()?
Можно ли использовать один индекс при доступе к вектор-столбцу?
Россия навсегда! Вячеслав Мезенцев
#2 Опубликовано: 05.06.2009 06:59:50
Valery Ochkov

Valery Ochkov

55 сообщений из 633 понравились пользователям.

Группа: User

Oйлер и Рунге-Кутта на MAS
http://twt.mpei.ac.ru/mas/worksheets/Euler.mcd
#3 Опубликовано: 05.06.2009 14:39:24
Andrey Ivashov

Andrey Ivashov

2270 сообщений из 3734 понравились пользователям.

Группа: Super Administrator

Wrote

Не могу понять, функции могут быть в качестве операндов пользовательской функции?


Не уверен, что понял вопрос. Если речь идёт о том, можно ли функции передовать через аргументы других функций, то да:
[live width=250 height=110]http://smath.info/live/?file=372[/live]
Wrote

Если ли аналог stack()?


Нет.
Wrote

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


Пока нет.
#4 Опубликовано: 06.06.2009 02:47:54
уни

уни

156 сообщений из 355 понравились пользователям.

Группа: User

Вот так:


Имелась в виду неявная передача указателя на функцию в качестве параметра.
Россия навсегда! Вячеслав Мезенцев
#5 Опубликовано: 06.06.2009 02:55:39
уни

уни

156 сообщений из 355 понравились пользователям.

Группа: User

Можно показать даже больше:

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

Valery Ochkov

55 сообщений из 633 понравились пользователям.

Группа: User

Ой, только не надо превращать SMath в инструмент показа программистских фокусов. Хотя я сам их очень люблю и много на своем веку напридумывал...
#7 Опубликовано: 08.06.2009 06:13:13
уни

уни

156 сообщений из 355 понравились пользователям.

Группа: User

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

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

Трудно ориентироваться в возможностях и правилах языка, когда нет его описания.
Россия навсегда! Вячеслав Мезенцев
#8 Опубликовано: 08.06.2009 08:59:52
Andrey Ivashov

Andrey Ivashov

2270 сообщений из 3734 понравились пользователям.

Группа: Super Administrator

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

Вечером-ночью поэкспериментирую в эту сторону и вернусь сюда с дополнительной информацией и/или вопросами.
#9 Опубликовано: 08.06.2009 11:08:12
уни

уни

156 сообщений из 355 понравились пользователям.

Группа: User

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

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

П.С. Если, кстати, этот метод интересно будет добавить в текущую встроенную численную библиотечку, то я могу написать аналог маткадовского rkfixed().
Россия навсегда! Вячеслав Мезенцев
#10 Опубликовано: 09.06.2009 10:05:37
Andrey Ivashov

Andrey Ivashov

2270 сообщений из 3734 понравились пользователям.

Группа: Super Administrator

Так и не дошли руки до экспериментов, попробую найти время сегодня.
Wrote

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


Было бы здорово! Что нужно для этого с нашей стороны?
#11 Опубликовано: 09.06.2009 10:56:12
уни

уни

156 сообщений из 355 понравились пользователям.

Группа: User

Для этого нужна "рыба", т.е. заготовка. Посмотрите на эту функцию в 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; // возвращаемое значение - код ошибки
Россия навсегда! Вячеслав Мезенцев
#12 Опубликовано: 09.06.2009 12:11:11
Andrey Ivashov

Andrey Ivashov

2270 сообщений из 3734 понравились пользователям.

Группа: Super Administrator

Хорошо. Получается, что возможность реализации упирается в отсутствие механизма передачи указателя функции. Сделаю и сразу сообщу об этом.
#13 Опубликовано: 09.06.2009 13:34:15
уни

уни

156 сообщений из 355 понравились пользователям.

Группа: User

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

уни

156 сообщений из 355 понравились пользователям.

Группа: User

Есть успехи в передаче функций внутрь плагинов?
Россия навсегда! Вячеслав Мезенцев
#15 Опубликовано: 13.10.2010 08:05:37
уни

уни

156 сообщений из 355 понравились пользователям.

Группа: User

Вижу, что успехи есть.

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


Странно работает stack. При составлении скаляра и вектора получается составной массив вместо вектора большего размера.
Это фича, баг или отличие от Mathcad'а?
Россия навсегда! Вячеслав Мезенцев
#16 Опубликовано: 13.10.2010 08:24:36
Andrey Ivashov

Andrey Ivashov

2270 сообщений из 3734 понравились пользователям.

Группа: Super Administrator

Приветствую!

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
уни

уни

156 сообщений из 355 понравились пользователям.

Группа: User

Да, это работает. Когда исправите stack() сделаю по аналогии для любой размерности задачи (как в Mathcad'е).


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

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