Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
8 / 6 / 2
Регистрация: 03.05.2016
Сообщений: 242

Решение ОДУ на Python

25.11.2021, 02:48. Показов 2077. Ответов 3

Студворк — интернет-сервис помощи студентам
Добрый вечер, уважаемые форумчане! Есть одна проблема, написал скрипт для решения задачи Коши, методом Эйлера, чтобы можно было строить графики ошибок и вычислять ошибку численного решения, однако, не могу понять, почему возникла такая ошибка:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# Author: Alm99-collab
# Date: 25/11/2021 2:00
# Description: MSUT STANKIN Μyagkov Alexandr IDM - 21 - 03
 
import numpy as np
import matplotlib.pyplot as plt
import math
 
 
# фнукция решатель методом Эйлера (прямая схема)
def euler(func, Y0, b, n):
    """Решение ОДУ u'=f(y,x), начальное условие y(0) = U0 , c n шагами, пока  x = b - конец отрезка интегрирования."""
    x = np.zeros(n + 1)
    y = np.zeros(n + 1)
    y[0] = Y0
    x[0] = 0
    dx = b / float(n)
    for k in range(n):
        x[k + 1] = x[k] + dx
        y[k + 1] = y[k] + dx * func(y[k], x[k])
    return y, x
 
 
# Сравнение точного аналитического решения и численного
 
# функция возврата точного решения
def y_exact(x):
    return ((x ** 2) / 2) - (x / 2) + 0.75 * math.exp(-2 * x) + 0.25
 
 
# Функция постановки задачи: y'= y
def func(y_exact, x):
    return x ** 2 - 2 * y_exact(x)
 
 
y, x = euler(func, Y0 = y_exact(0), b = 1, n = 10)
y_e = y_exact(x)
 
err = np.abs(y_e - y).max()
# err = np.abs(y_e - y).max()
 
# построение графика
plt.plot(x, y, 'r-', label = 'numerical')
plt.plot(x, y_exact, 'b-',label = 'exact', marker = '*', markersize = 3)
plt.xlabel('t')
plt.ylabel('y(t)')
plt.legend()
plt.title = "Решение для ОДУ y'= y, y(0)=1"
plt.grid()
plt.savefig('Sols.png', dpi=600)
plt.show()

Ошибка следующая возникла:
Code
1
2
File "C:\SM2-rep\euler_ode.py", line 33, in func return x ** 2 - 2 * y_exact(x)
TypeError: 'numpy.float64' object is not callable
Подскажите пожалуйста, в чем проблема, так то все вроде бы нормально,но...
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.11.2021, 02:48
Ответы с готовыми решениями:

Решение ОДУ методами Рунге - Кутта
Добрый день! Подскажите, пожалуйста пакеты с помощью которых можно решать задачи вычислительной математики в питоне, в частности меня...

Численное решение ОДУ второго порядка с odeint
Здравствуйте! Решаю диффур \ddot{y}+4y=0 при начальных условиях y(0) = 1, \dot{y}(0) = 1, аналитическим решением которого будет y = \cos...

Решение ОДУ с использованием scipy odeint с массивом значений
Всем доброго времени суток. Имеется ОДУ первого порядка(пример): dn/dt=A*n; n(0)=n0 В случае, когда A константа, оно...

3
Эксперт Python
8849 / 4500 / 1864
Регистрация: 27.03.2020
Сообщений: 7,316
25.11.2021, 05:37
Лучший ответ Сообщение было отмечено dux99 как решение

Решение

dux99,
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# Author: Alm99-collab
# Date: 25/11/2021 2:00
# Description: MSUT STANKIN Μyagkov Alexandr IDM - 21 - 03
 
import numpy as np
import matplotlib.pyplot as plt
import math
 
 
# фнукция решатель методом Эйлера (прямая схема)
def euler(func, Y0, b, n):
    
    """Решение ОДУ u'=f(y,x), начальное условие y(0) = U0 , c n шагами, пока  x = b - конец отрезка интегрирования."""
    x = np.zeros(n + 1)
    y = np.zeros(n + 1)
    y[0] = Y0
    x[0] = 0
    dx = b / float(n)
    
    for k in range(n):
        x[k + 1] = x[k] + dx
        y[k + 1] = y[k] + dx * func(x[k])
        print(y)
    return y, x
 
 
# Сравнение точного аналитического решения и численного
 
# функция возврата точного решения
def y_exact(x):
    return ((x ** 2) / 2) - (x / 2) + 0.75 * math.exp(-2 * x) + 0.25
 
 
# Функция постановки задачи: y'= y
def func(x):
    print(x)
    return x ** 2 - 2 * y_exact(x)
 
 
y, x = euler(func, Y0 = y_exact(0), b = 1, n = 10)
y_e = ((x ** 2) / 2) - (x / 2) + 0.75 * np.exp(-2 * x) + 0.25
 
err = np.abs(y_e - y).max()
print(err)
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38171 / 21106 / 4307
Регистрация: 12.02.2012
Сообщений: 34,702
Записей в блоге: 14
25.11.2021, 08:27
dux99, в строке 20 вашего кода вы вызываете func, передав первым параметром число y[k], тогда как определение функции (стр. 32-33) предполагает, что первый параметр func - функция
1
8 / 6 / 2
Регистрация: 03.05.2016
Сообщений: 242
25.11.2021, 10:09  [ТС]
Gdez,
спасибо огромное!


Catstail,
вот если в качетсве правой части ДУ рассматривать такую фукнцию
Python
1
2
def func(y, x):
      0.2 + (y - y_exact(x))**4
а, точное решение задано например в виде:
Python
1
2
def y_exact(t):
      return 0.2*t + 3
то данный код сработает:
Python
1
2
3
y, x = ForwardEuler(func, Y0=y_exact(0), T=0.1, n=10)
y_e = y_exact(x)
error = np.abs(u_e - u).max()
Но теперь понятна ошибка! Всем огромное спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.11.2021, 10:09
Помогаю со студенческими работами здесь

Численное решение задачи коши для оду первого порядка
дана задача коши, необходимо решить ее, используя метод Гира , подскажите как можно реализовать ? проблема в том, что в методе стоит yi...

Аналитическое решение решение краевой задачи для ОДУ второго порядка
Здравствуйте! Задача: Аналитически найти частное решение ОДУ. Изначально в частных производных, но это оду(если я неправ поправьте!) ...

Найдите общее решение и решение задачи Коши для ОДУ
Найдите общее решение и решение задачи Коши для ОДУ (с разделяющимися переменными, с однородной правой частью, или сводящееся к ним) : (1...

Решение ОДУ
Почему не хочет определять переменные? Пример взят из справочника

Решение ОДУ
Доброго времени суток, имеется задача: x0.5d2y/dx2=y1.5 y(0)=1, y(inf)=0. Попытался решить следующим образом, однако как подставить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru