Мне нужно решить такое ДУ:
,
где
известны и их легко представить в виде конечных двойных рядов:
Поэтому
тоже конечный двойной ряд.
Чтобы найти
нужно просуммировать по всем возможным коэффициентам.
Помогите построить алгоримт для определения ненулевых коэффициентов.
На примере поясню, что меня затрудняет. Пусть заданы
:
Код:
f1 = x3^(3/2) (A1 Cos[8 x1] + B1 Cos[9 x1]) Cos[x2];
f2 = x3^(3/2) (A2 Cos[8 x1] + B2 Cos[9 x1]) Cos[3 x2];
Теперь нужно найти коэффиценты разложения
и возможные значения
. Для этого можно сделать так:
Код:
FourierCoefficient[f1, x1, n]
FourierCoefficient[f1, x2, m]
Получили значения
с ненулевыми коэффициентами:
и
.
Мне не ясно как автоматически вытащить значения
. Если функции сложные, то все вписывать руками трудно.
Другой способ -- вытащить набор
:
Код:
f1 // TrigToExp // Expand
И для сложных функций (но с конецным представлением) этот способ быстрее.
Здесь тоже не понятно как вытащить набор
автоматически.
Аналогично некий набор чисел
нужно определить для правой части ДУ,
чтобы понять какие понять какие коэффициенты
не ноль.
Последняя проблема с поиском самих коэффициентов. Допустим что мы знаем
и
для
, тогда есть два способа найти коэфф. (медленный и быстрый):
Код:
ns = {8, -8, 9, -9};
ms = {1, -1};
Способ 1 (очень медленный):
Код:
Do[
{
f1c[n, m] = FourierCoefficient[f1, {x1, x2}, {n, m}]
},
{n, ns},
{m, ms}
]
Способ 2:
Код:
Do[
{
f1C[n, m] =
Coefficient[f1 // TrigToExp // Expand, E^(I (n x1 + m x2))]
},
{n, ns},
{m, ms}
];
f1 - Sum[f1C[n, m] E^(I (n x1 + m x2)), {n, ns}, {m, ms}] // Simplify
Во втором способе нужно отдельно считать коэфф. (0,0), если есть, например:
Код:
f1 = f1 + f100;
Coefficient[{f1 // TrigToExp // Expand } /. E^n_ -> x, x, 0]
Здесь я не уверен, что второй способ всегда работает правильно.
Можно ли как то проще сделать алготитм разложения?
-- Пт окт 18, 2013 10:58:54 --Придумал, как достать набор используя FourierCoefficient:
Код:
f1 = J^(3/2) (A1 Cos[8 x1] + B1 Cos[9 x1]) Cos[x2];
set1 = FourierCoefficient[f1, x1, n][[1]];
set2 = FourierCoefficient[f1, x2, m][[1]];
l1 = Length[set1];
l2 = Length[set2];
ns = Table[set1[[i]][[2]], {i, 1, l1}];
ms = Table[set2[[i]][[2]], {i, 1, l2}];
ns = ToExpression[StringReplace[
StringReplace[
ToString[ns],
"||" -> ","],
"n == " -> " "
]];
ms = ToExpression[StringReplace[
StringReplace[
ToString[ms],
"||" -> ","],
"m == " -> " "
]];
ns
ms
Do[
f1C[n, m] = Coefficient[f1 // TrigToExp, E^(I (n x1 + m x2))],
{n, ns},
{m, ms}
];
f1 - Sum[f1C[n, m] E^(I (n x1 + m x2)), {n, ns}, {m, ms}] // Simplify