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) он не может решить, как решить?

from sympy import *

Никогда так не делай в рабочем коде.

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

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

Если первое, то 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 ★★★★★
()
Ответ на: комментарий от fsb4000

в натуре четко, хотя он похоже 9 потерял у второй производной и знак поменял

bad_master ★
() автор топика
Последнее исправление: bad_master (всего исправлений: 1)
Ответ на: комментарий от 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 ★★★★★
()
Ответ на: комментарий от Bad_ptr

1 не понял
2 А как же монады? В том числе ST

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

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

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

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

В VSCode ctrl+shift+i

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

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

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

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

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