Уравнение в функцию

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

Модератор: Admin

Andrey
Сообщения: 667
Зарегистрирован: Пн июн 10, 2002 2:05 pm

Уравнение в функцию

Сообщение Andrey » Пн янв 26, 2009 5:05 pm

Есть уравнение, например А==В. Нужно получить функцию, которая равна нулю, в данном случае А-В, т.е. из левой части вычесть правую. Возможно ли это стандартными средствами?

Zlog
Сообщения: 82
Зарегистрирован: Сб июл 15, 2006 11:42 am
Откуда: из "Баголовка"
Контактная информация:

Сообщение Zlog » Вт янв 27, 2009 10:31 am

Под стандартными средствами вы понимаете какую-нибудь специальную функцию типа Solve? У меня найти такую не получилось.
Но можно немного нестандартно.
Если expr = A==B, то expr[[1]] - это левая часть этого уравнения, а expr[[2]] - правая. Когда expr - уравнение одной переменной х, можно получить нужную вам функцию следующим образом:

Код: Выделить всё

f[x_]=expr[[1]]-expr[[2]]

Andrey
Сообщения: 667
Зарегистрирован: Пн июн 10, 2002 2:05 pm

Сообщение Andrey » Вт янв 27, 2009 3:50 pm

Да, спасибо, вполне устроит
Еще один вопрос: есть формула
a*x+b*y+c
нужно вытащить коэффициенты при переменных x и y и свободный член. Коэффициенты при переменных x и y без проблем:
Coefficient[a*x+b*y+c,{x,y}]
А как свободный член?

Zlog
Сообщения: 82
Зарегистрирован: Сб июл 15, 2006 11:42 am
Откуда: из "Баголовка"
Контактная информация:

Сообщение Zlog » Вт янв 27, 2009 4:04 pm

Прямо сейчас не могу проверить. Но есть предположение, что у функции Coefficient может быть третий параметр - степень, для которой коэффициент находить.
Ну и CoefficientList уж точно свободный член находить умеет.

Andrey
Сообщения: 667
Зарегистрирован: Пн июн 10, 2002 2:05 pm

Сообщение Andrey » Вт янв 27, 2009 4:43 pm

Zlog писал(а):Прямо сейчас не могу проверить. Но есть предположение, что у функции Coefficient может быть третий параметр - степень, для которой коэффициент находить.


Это да, но когда несколько переменных, как задать эту степень?

Zlog писал(а):Ну и CoefficientList уж точно свободный член находить умеет.

Я эту функцию вообще понять не могу. Для трех переменных (формула линейная) дает таблицу 2-на-2-на-2. Причем элемент [[1,1,1]] отвечает свободному члену, а [[2,2]]=={0,0}. Остальные как то разбросаны по массиву.

Zlog
Сообщения: 82
Зарегистрирован: Сб июл 15, 2006 11:42 am
Откуда: из "Баголовка"
Контактная информация:

Сообщение Zlog » Вт янв 27, 2009 4:55 pm

Напишите сюда, пожалуйста, пару многочленов, для которых коэффициенты найти надо. А я дома уточню, что надо сделать, чтобы свободные члены из полиномов достать.
Upd. Но можно получить свободный член, занулив все переменные в функции: f(0,0).

Andrey
Сообщения: 667
Зарегистрирован: Пн июн 10, 2002 2:05 pm

Сообщение Andrey » Вт янв 27, 2009 6:33 pm

Zlog писал(а):Напишите сюда, пожалуйста, пару многочленов, для которых коэффициенты найти надо. А я дома уточню, что надо сделать, чтобы свободные члены из полиномов достать.

Код: Выделить всё

(2*cn*ddl^2 - 2*ddl^2*Y0 + dt*(k1*(-Y0 + Y1) + k2*(-Y0 + Y2) + k0*(-2*Y0 + Y1 + Y2)) +
   ddl*dt*(f1*V0*Y0 - f2*V0*Y0 + (-1 + f0)*(V1*Y0 - V2*Y0 + V0*Y1 - V0*Y2)))/(ddl*dt) == 0

переменные Y0, Y1, Y2

Код: Выделить всё

(-(((k0 + k1)*(u0 - u1))/t01) + ((k0 + k2)*(-u0 + u2))/t02)/t12 - (u0 - U0)/dt== 0

переменные u0, u1, u2

Zlog писал(а):Но можно получить свободный член, занулив все переменные в функции: f(0,0).[/i]
или вычесть из полинома переменные, умноженные на собственные коэффициенты. А как-нибудь изящнее?

Zlog
Сообщения: 82
Зарегистрирован: Сб июл 15, 2006 11:42 am
Откуда: из "Баголовка"
Контактная информация:

Сообщение Zlog » Ср янв 28, 2009 10:57 am

Про CoefficientList объяснить и понять лучше всего сразу на примере.

Код: Выделить всё

poly = f(x,y,z)
ls = CoefficientList[poly, {x, y, z}]

Результатом работы функции будет массив ls, в котором на месте ls[[i+1, j+1, k+1]] находится коэффициент при члене x^i*y^j*z^k. В вашем случае, когда надо найти свободный член, можно всегда обращаться к элементу, индексы которого имеют самый маленький номер. То есть, к ls[[1,1]] когда переменных две, к ls[[1,1,1]], когда переменных три и так далее.

Для случая двух переменных x и y, функция возвращает массив, в котором строки соответствуют возврастающим степеням x, а столбцы - возрастающим степеням y:

Код: Выделить всё

   y^0   y^1 y^2 ...
x^0   a11   a12   a13 ...
x^1   a21   a22   a23   ...
x^2   a31   a32   a33   ...
...   ...   ...   ...   ...

На три и более переменных аналогия сохраняется, только появляются дополнительные измерения.
С помощью Coefficientвыделить свободный член у меня не получилось.

Andrey писал(а):
Zlog писал(а):Но можно получить свободный член, занулив все переменные в функции: f(0,0).[/i]
или вычесть из полинома переменные, умноженные на собственные коэффициенты. А как-нибудь изящнее?

Мне по-прежнему кажется изящным подход с занулением переменных.

Код: Выделить всё

poly /. (# -> 0 &) /@ {x, y, z}

volmike
Сообщения: 235
Зарегистрирован: Вс июн 05, 2005 2:42 pm
Контактная информация:

Сообщение volmike » Ср янв 28, 2009 9:59 pm

Для любого количества переменных (линейная функция) свободный член можно найти так:

CoefficientList[f,{varlist}]//Flatten//First,

где varlist - список всех переменных функции f через запятую.
Лысый пешему не конный...

volmike
Сообщения: 235
Зарегистрирован: Вс июн 05, 2005 2:42 pm
Контактная информация:

Сообщение volmike » Ср янв 28, 2009 11:02 pm

В 7-ой версии появилась православная функция MonomialList, с помощью которой свободный член любого полинома можно получить так:

Код: Выделить всё

MonomialList[(2*cn*ddl^2 - 2*ddl^2*Y0 +
    dt*(k1*(-Y0 + Y1) + k2*(-Y0 + Y2) + k0*(-2*Y0 + Y1 + Y2)) +
    ddl*dt*(f1*V0*Y0 -
       f2*V0*Y0 + (-1 + f0)*(V1*Y0 - V2*Y0 + V0*Y1 - V0*Y2)))/(ddl*
    dt), {Y0, Y1, Y2}]//Last

Лысый пешему не конный...

Andrey
Сообщения: 667
Зарегистрирован: Пн июн 10, 2002 2:05 pm

Сообщение Andrey » Ср янв 28, 2009 11:35 pm

Zlog писал(а):Результатом работы функции будет массив ls, в котором на месте ls[[i+1, j+1, k+1]] находится коэффициент при члене x^i*y^j*z^k. В вашем случае, когда надо найти свободный член, можно всегда обращаться к элементу, индексы которого имеют самый маленький номер. То есть, к ls[[1,1]] когда переменных две, к ls[[1,1,1]], когда переменных три и так далее.


Спасибо! Неплохо получилось

Код: Выделить всё

eq = a x + b y + c z == d
f = eq[[1]] - eq[[2]]
ls = CoefficientList[f, {x, y, z}]
pos = {{0, 0, 0}, {1, 0, 0}, {0, 1, 0}, {0, 0, 1}} + 1
{dd, aa, bb, cc} = Table[ls[[Sequence @@ pos[[i]]]], {i, 4}]

такое присвоение в pos для понимания, чтобы через пару лет не ужаснуться и не переделать все заново