2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Maple. Возможно ли на вход процедуры передать часть процедур
Сообщение07.11.2012, 10:28 


13/12/08
213
Ижевск
Возможно ли на вход процедуры передать часть другой процедуры? Процедура передаваемая в конкретном случае имеет параметр, но, хотелось бы её передавать обобщенно, для использования с различными процедурами.
Более конкретно. Требуется численно продифференцировать в некоей точке собственную функцию, полученную при помощи $dsol1:= dsolve({eq1, init_con},    numeric, range = 0..1); $. Т.е. аналитического решения нет. Я могу прописать это внутри некоей специальной процедуры ручками, но это "противу правил" модульного программирования.
Нужно передать $ rhs(op(2,dsol1)); $ это, если без параметра, либо $ rhs(op(2,dsol1(t))); $ с параметром начальным, далее вместо t подставлять конкретные значения.
Как сделать это?
Возможно ли передавать в виде строки, с преобразованием в то, что требуется?

 Профиль  
                  
 
 Re: Maple. Возможно ли на вход процедуры передать часть процедур
Сообщение07.11.2012, 12:54 
Заморожен


14/09/10
72
Вопрос плохо сформулирован. Я постараюсь угадать.

Язык Maple не строго типизированный язык. Если в описании аргументов процедуры при её определении указание типов отсутствует, то проверка не выполняется. В качестве аргумента вы можете передать имя процедуры. Пример.
Код:
> equ:= diff(y(x), x) = y(x):# определяем диф. уравнение
> f:= (u) -> rhs(op(2, dsolve ({equ, y(1) = exp(1)}, numeric, range=1..2)(u))):
> MyDiff:= proc(g, x0, delta_x)
     description "вычисляет в x0 отношение приращения функции к приращению арг";
     (g(x0+delta_x)-g(x0))/delta_x;
   end:
> MyDiff(f, 2, 0.1);
                      7.771140430
Использование op(2, dsolve()) — это устаревший и плохо читабельный подход. Вместо этого уже давно используют более читабельный вариант с опцией listprocedure (см. справку пакета). Т.е. вместо
f:= (u) -> rhs(op(2, dsolve ({equ, y(1) = exp(1)}, numeric, range=1..2)(u)));
пишут
f:= eval(y(x), dsolve ({equ, y(1) = exp(1)}, numeric, output=listprocedure, range=1..2));

С целью облегчения отладки программы аргумент g может быть описан как процедура: MyDiff:= proc(g::procedure, x0, delta_x). В этом случае неправильный вызов Mydiff(1, 2, 0.1); вернет “ Error, invalid input: Mydiff expects its 1st argument, g, to be of type procedure, but received 1”.


Если ваш вопрос вызван конкретной проблемой, а не учебным заданием, то лучше точно или подробно сформулировать проблему и привести её упрощенный вариант, передающий без излишних деталей суть затруднений.

 Профиль  
                  
 
 Re: Maple. Возможно ли на вход процедуры передать часть процедур
Сообщение07.11.2012, 17:53 


13/12/08
213
Ижевск
Andrew Gubarev в сообщении #641088 писал(а):

Если ваш вопрос вызван конкретной проблемой, а не учебным заданием, то лучше точно или подробно сформулировать проблему и привести её упрощенный вариант, передающий без излишних деталей суть затруднений.

Заработало для одного ДУ. Теперь надо аналогичное для системы двух ДУ.
Задача следующая. Пробую метод ускоренной сходимости (Акуленко. Нестеров) решения задач на собственные значения. В процессе требуется вычислить взвешенную норму с весом r(x). Либо численное интегрирование, либо. приближенно заменяется произведением, в которое входят собственная функция, функция чувствительности собственной функции (sensitivity of eigenfunction), извиняюсь за свой "французский", образование инженерно-артиллерийское, и производная собственной функции, всё это в конкретной точке.
Собственная функция и функция чувствительности получаются из совместного решения задачи Коши для системы двух ОДУ второго порядка. Да, кстати, не требуется численного дифференцирования, поскольку производная тоже есть в решении задачи Коши, только сейчас сообразил и увидел.
Но, однако, на будущее, хорошо бы научиться передавать таким образом функцию в функцию.
Здесь вот что:
Определил $eq2$ -- ОДУ для получения собственной функции (решение задачи Коши при уже вычисленном приближении собственного значения на предыдушем шаге.
Определил $eq4$ -- ОДУ для функция чувствительности собственной функции.
Поставил начальные условия
\begin{verbatim} 
$init_con1 := u(0)=0, D(u)(0)=1, h(0)=0, D(h)(0)=0; 
\end{verbatim}
Ввожу и получаю
\begin{verbatim}
> f:=eval({u(x), h(x)},dsolve({eq2, eq4, init_con1},numeric, output =
> listprocedure, range = 0..1));
Error, (in dsolve/numeric/process_input) system must be entered as a
set/list of expressions/equations

\end{verbatim}
И когда одиночный (только $u(x)$ вывод из системы, тоже ругается.
Но, через $rhs(op(2, dsolve ....$ получается.

 Профиль  
                  
 
 Re: Maple. Возможно ли на вход процедуры передать часть процедур
Сообщение07.11.2012, 18:38 
Заморожен


14/09/10
72
Вот простой демонстрационный пример, Maple 12 Classic worksheet
Код:
> eq2:= diff(u(x),x$2) + u(x)=0:
> eq4:= diff(h(x),x$2) + h(x)=0:
> ICs:= u(0)=0, D(u)(0)=1, h(0)=0, D(h)(0)=0:
> f:= eval([u(x), h(x)], dsolve({eq2, eq4, ICs}, numeric, output=listprocedure, range=0..1)):
> f(0.5);
                  > [.479425582064474554, 0.]
На ошибку не влияет, но вместо фигурных скобок нужно ставить квадратные — важен порядок возвращаемых значений.

Пожалуйста, набирайте текст программ в теге code или tt и указывайте версию пакета.

 Профиль  
                  
 
 Re: Maple. Возможно ли на вход процедуры передать часть процедур
Сообщение07.11.2012, 19:02 


13/12/08
213
Ижевск
Andrew Gubarev в сообщении #641204 писал(а):
Вот простой демонстрационный пример, Maple 12 Classic worksheet
Код:
> eq2:= diff(u(x),x$2) + u(x)=0:
> eq4:= diff(h(x),x$2) + h(x)=0:
> ICs:= u(0)=0, D(u)(0)=1, h(0)=0, D(h)(0)=0:
> f:= eval([u(x), h(x)], dsolve({eq2, eq4, ICs}, numeric, output=listprocedure, range=0..1)):
> f(0.5);
                  > [.479425582064474554, 0.]
На ошибку не влияет, но вместо фигурных скобок нужно ставить квадратные — важен порядок возвращаемых значений.

Пожалуйста, набирайте текст программ в теге code или tt и указывайте версию пакета.


Спасибо.
Кстати, Maple 7 в качестве боевой программы, поскольку её можно легально использовать ля любых применений.

 Профиль  
                  
 
 Re: Maple. Возможно ли на вход процедуры передать часть процедур
Сообщение07.11.2012, 21:08 
Заморожен


14/09/10
72
Проверил. В седьмой версии приведенный мною выше пример с eval(([u(x), h(x)], dsolve) работает.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group