LINUX.ORG.RU

Решить диффур питон

 , ,


0

1

Вот код

from sympy import *
def print_hi(name):
    print(f'Hi, {name}')

if __name__ == '__main__':
    x,t = symbols('x,t')
    u = Function('u')
    ex=diff(u(x,t),t)-9*diff(u(x,t),x,2)-1-2*x*t-5*t*sin(3*pi*x/2)
    con={u(0,t):t,diff(u(x,t),x).subs(1,t):t*t,u(x,0):3*x}
    y=dsolve(ex,ics=con)
    print(ex)
    print(simplify(y))
ошибка такая ValueError: dsolve() and classify_ode() only work with functions of one variable, not u(x, t) он не может решить, как решить?

Задача именно диффур решить или сделать это на питоне?

Если первое, то Maxima однозначно твой выбор.

zx_gamer ★★★
()

Сначала написать дифур на бумашке в математических терминах и показать людям

AntonI ★★★★★
()
Ответ на: комментарий от bad_master

С этими cas сплошная молока. Да, им все надо разжевывать

AntonI ★★★★★
()

Спросил у GPT бота.

Вот его ответ, я не знаю насколько он прав или сочиняет:

Начало ответа бота"

Ошибка возникает из-за того, что dsolve из библиотеки SymPy не может решать уравнения, содержащие функции нескольких переменных, в данном случае u(x,t).

Чтобы решить эту проблему, можно заменить функцию u(x, t) одной переменной u(z), где z - это новая переменная, зависящая от x и t. Это можно сделать с помощью замены z = x + c*t, где c - произвольная константа. Тогда x и t могут быть выражены через z как x = z - c*t и t = (x - z) / (-c).

Применяя эту замену, можно переписать уравнение в следующей форме:

u_z = diff(u(z), z)
u_zz = diff(u_z, z)
eq = u_z + c*u_zz - 1 - 2*(z - c*t)*t - 5*t*sin(3*pi*(z - c*t)/2)

Здесь u_z и u_zz - это первая и вторая производные функции u(z), соответственно. eq - это новое уравнение с замененной функцией u(z).

Также нужно изменить начальные условия в соответствии с новой переменной z:

con = {u(0): t, u_z.subs(z, 1): t*t, u(z).subs(z, 0): 3*z}

Здесь u_z.subs(z, 1) заменяет x на 1 и t на (1 - z) / (-c), а u(z).subs(z, 0) заменяет x на 0 и t на z / c.

Измененный код будет выглядеть следующим образом:

from sympy import *

if __name__ == '__main__':
    z, c = symbols('z c')
    u = Function('u')
    u_z = diff(u(z), z)
    u_zz = diff(u_z, z)
    eq = u_z + c*u_zz - 1 - 2*(z - c*t)*t - 5*t*sin(3*pi*(z - c*t)/2)
    con = {u(0): t, u_z.subs(z, 1): t*t, u(z).subs(z, 0): 3*z}
    y = dsolve(eq, ics=con)
    print(eq)
    print(simplify(y))

Здесь c является произвольной константой замены, которую нужно выбрать самостоятельно.

"конец ответа бота.

fsb4000 ★★★★★
()
Ответ на: комментарий от bad_master

Да, за ботом нужно перепроверять.

Я попросил уточнить бота:

Мой вопрос: «Не потерял ли ты 9 у второй производной? И не ошибся ли со знаком, можешь ли перепроверить?»

Его ответ:

Вы правы, при замене переменных я допустил ошибку и потерял коэффициент 9 перед второй производной. Исправленный уравнение должно выглядеть следующим образом:

u_z = diff(u(z), z)
u_zz = diff(u_z, z)
eq = diff(u(z), t) - 9*u_zz - 1 - 2*z*t - 5*t*sin(3*pi*z/2)

Что касается знака перед sin в уравнении, я также допустил ошибку и указал неправильный знак. Верный знак должен быть плюс, то есть уравнение должно выглядеть так:

u_z = diff(u(z), z)
u_zz = diff(u_z, z)
eq = diff(u(z), t) - 9*u_zz - 1 - 2*z*t + 5*t*sin(3*pi*z/2)

Извините за путаницу. Спасибо, что обратили на это внимание!

fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от bad_master

Новый ответ бота:

Да, извините, я допустил ошибку в предыдущем ответе. Действительно, в уравнении необходимо использовать замену переменных, чтобы привести его к уравнению вида u_zz + p(z)*u_z + q(z)*u = f(z, t).

Исправленный код должен выглядеть следующим образом:

from sympy import *

if __name__ == '__main__':
    x, t = symbols('x t')
    u = Function('u')
    z = x + c*t
    u_z = diff(u(z), z)
    u_zz = diff(u_z, z)
    p = simplify(diff(z, x))
    q = simplify(diff(z, x, x))
    f = -1 - 2*x*t - 5*t*sin(3*pi*x/2)
    eq = u_zz + p*u_z + q*u - f
    con = {u(0): t, u_z.subs(z, 1): t*t, u(z).subs(z, 0): 3*x}
    y = dsolve(eq, ics=con)
    print(eq)
    print(simplify(y))

Здесь p и q - это функции, соответствующие коэффициентам уравнения при первой и второй производных функции u(z). Переменная f - это правая часть уравнения.

Извините за путаницу, и благодарю за замечание!

fsb4000 ★★★★★
()
Ответ на: комментарий от Werenter

Ну записывай недостатки хаскеля:
1) не гомоиконный
2) не поддерживает императивное программирование

Bad_ptr ★★★★★
()
Ответ на: комментарий от fsb4000

не вдаваясь в код скажу лишь что в нем опять ошибки - он не запускается

bad_master
() автор топика

Код отформатируй, а то прочитать сложно

В VSCode ctrl+shift+i

nikitalol ★★
()
Последнее исправление: nikitalol (всего исправлений: 1)
Ответ на: комментарий от eternal_sorrow

Почти во всех туториалах для новичков так почем то делают

nikitalol ★★
()
Ответ на: комментарий от fsb4000

Ну всё, наступила эпоха, и ЛОР не нужен теперь…

seiken ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.