Построение ф-ции с опциями на основе другой ф-ции с опциями

Форум пользователей пакета Mathematica

Модератор: Admin

Rodian
Сообщения: 5
Зарегистрирован: Сб окт 29, 2011 9:18 am
Откуда: Россия

Построение ф-ции с опциями на основе другой ф-ции с опциями

Сообщение Rodian » Пн фев 24, 2014 4:00 pm

Здравствуйте. Чтобы объяснить проблему, сначала напишу код используя обычное задание функций, затем попробую переписать его используя функции с опциями.

Часто у функции кроме основной переменной есть параметры. Пусть:
x - основная переменная,
a, b - параметры,

Для примера, зададим функции g и f (пока без опций):

a = 2; b = 0.5;
g[x_, a_] := Sin[x*a];
f[x_, a_, b_] := g[x, a]/b;

В этом примере функция "f" строиться на основе функции "g". У функций "f" и "g" явно указана зависимость от параметров "a" и "b" (это нужно, чтобы использовать эти параметры для построения динамического графика с помощью функции Manipulate).

Количество переменных у функции f три штуки, это: x, a, b. Для использования функции f всегда приходиться перечислять все переменные! Это очень неудобно!. Чтобы решить эту проблему нашёлся инструмент - функции с опциями. Итак, перепишем предыдущий код используя функции с опциями:

a = 2; b = 0.5;
Options[g] = {A -> a};
g[x_, OptionsPattern[]] := Sin[x*OptionValue[A]];

Дальше у меня проблемы с задание функции f. Приведу НЕ рабочий код:

Options[f] = {A -> a, B -> b};
f[x_, OptionsPattern[]] := g[x]/OptionValue[B];

Если мы захотим вычислить функцию f в точке x=1, A=4:

f[1, A -> 4]

То получим значение в точке x=1, A=a. Т. е. параметр A менять не получается. В этом и есть моя проблема.

Вопрос 1: как правильно задать новую функцию с опциями на основе другой функции с опциями?

Вопрос 2, дополнительный: как переименовать встроенную функцию "OptionValue" в "OV"?

Rodian
Сообщения: 5
Зарегистрирован: Сб окт 29, 2011 9:18 am
Откуда: Россия

Сообщение Rodian » Вт фев 25, 2014 6:12 am

Ответ на первый вопрос:
a = 2; b = 3;

Options[g] = {A -> a};
g[x_, OptionsPattern[]] := Sin[x*OptionValue[A]];

Options[f] = Join[Options[g], {B -> b}];
f[x_, opt : OptionsPattern[]] := g[x, opt]/OptionValue[B];

Примеры использования:
f[1]
f[i, A -> 5]
f[i, A -> j, B -> k]

Второй вопрос остаётся открытым.

Rodian
Сообщения: 5
Зарегистрирован: Сб окт 29, 2011 9:18 am
Откуда: Россия

Сообщение Rodian » Ср мар 05, 2014 4:45 am

Ответ на второй вопрос:
$PreRead = ReplaceAll[#, "OV" -> "OptionValue"] &;