Как решить функцию y = f (x, y), т. Е. Функциональное значение зависит от самого себя - PullRequest
2 голосов
/ 04 июня 2019

Я хочу решить следующее уравнение в python.Проблема в том, что зависимая переменная 'y' также присутствует в правой части уравнения.Первый вопрос, как такие уравнения называются в математике?

Я могу решить это, если пропущу 'y' из RHS.Но не знаю, как решить, удерживая его на месте.

enter image description here

Я использовал следующий код: импортировать numpy как np из matplotlib import pyplot как plt

A=2
B=1.3
C=0.25
D=1.25
def func(x,A,B,C,D):
  y=A*np.sinh(((x)/B-C)/D)  #I skipped (x-y) here
  return y

x=np.linspace(-3,3,200)
y=func(x,A,B,C,D)
plt.plot(x,y)
plt.show()

Ответы [ 3 ]

4 голосов
/ 04 июня 2019

Такие нелинейные уравнения часто решаются итерационным способом. Установите y=0, решите уравнение, получите новое y, вставьте новое значение в RHS и повторите процесс. Отслеживайте значение y(j)-y(j-1), чтобы проверить сходимость. Если он не встречается, попробуйте смешать предыдущую часть RHS с текущей деталью с определенным весом: RHS (j) = w * RHS (j) + (1-w) RHS (j-1). Ниже приведены некоторые полезные ссылки об этом:

* 1007 вики *

Книга: Итеративное решение нелинейных уравнений с несколькими переменными Дж. М. Ортега, В. К. Райнболдт

Вот ваш пример изменен:

import matplotlib.pyplot as plt
A=2
B=1.3
C=0.25
D=1.25
def func(x,z,A,B,C,D):
  y=A*np.sinh(((x-z)/B-C)/D)  #I skipped (x-y) here
  return y

x=np.linspace(-3,3,200)
y = np.zeros(x.shape)
w = 0.4
d = 10
track_d = []

while d > 0.01:
    track_d.append(d)
    temp = y
    y = w * y + (1-w) * func(x,y,A,B,C,D)
    d = np.max(np.abs(temp-y))

y=func(x, y,A,B,C,D)
plt.plot(x,y)
plt.show()

plt.plot(track_d)
plt.show()

Для большего интервала это выглядит интереснее, обратите внимание на параметр w.

import matplotlib.pyplot as plt
A=2
B=1.3
C=0.25
D=1.25
def func(x,z,A,B,C,D):
  y=A*np.sinh(((x-z)/B-C)/D)  #I skipped (x-y) here
  return y

x=np.linspace(-30,30,200)
y = np.zeros(x.shape)
w = 0.99999999
d = 10
track_d = []

while d > 0.0000001:
    track_d.append(d)
    temp = y
    y = w * y + (1-w) * func(x,y,A,B,C,D)
    d = np.max(np.abs(temp-y))

y=func(x, y,A,B,C,D)
plt.plot(x,y)
plt.show()
# look at the convergence
plt.plot(track_d)
plt.show()

enter image description here

1 голос
/ 06 июня 2019

Ваша функция в целом называется рекуррентным отношением в форме

enter image description here

. Ее можно решить численно, выбрав начальное значениеу, а затем положить это в уравнение, вычисляя следующее значение у.И повторяя вычисление, помещая следующее значение y как предыдущее значение y в уравнение.Расчеты повторяются в цикле, пока значение y не сходится.Значение Y может не сходиться.Даже в этом случае вы можете проанализировать систему дальше.Вы можете попробовать построить график y n = f (y n-1 ) и посмотреть, что у вас есть.В случае, если система стабильна кривая должна быть сильно периодической и замкнутой , в противном случае не сходящаяся система является хаотической и такие уравнения можно выбросить из окна.

Некоторые примеры устойчивых систем: Кривые Лиссажу :

enter image description here

Некоторыми примерами хаотических систем являются Аттрактор Росслера :

enter image description here

y = A * sinh (-yC) анализ

Чтобы проверить, работает ли ваша системастабильный или нет - давайте попробуем модулировать функцию sin(x) с вашим отношением повторения гиперболического греха: y=k*SIN(x)+0.88*SINH(-y-0.02) и попробуем нарисовать эту параметрическую диаграмму повторения y prev vs y next .

k = 0

enter image description here

Не так много, чтобы увидеть здесь, потому что в этом случае мы получаем ваш оригиналуравнение, которое имеет очень низкое разрешение между точками данных.Все они лежат вдоль некоторой линии, с небольшим рассеянием, которое мы не можем различить глазами - вот почему нам нужен грех (x) здесь!

k = 0,0005

enter image description here

Гораздо интереснее.Теперь видно, что ваша «линия» вовсе не является линией и имеет какое-то хаотичное поведение.Но давайте рассмотрим что-то более привлекательное.

k = 0,005

enter image description here

В некоторых местах sinh ()повторение побеждает, а у некоторых - грех ().Давайте попробуем принудительно вызвать функцию sin (), чтобы увидеть, будет ли она периодически модулироваться и с замкнутым циклом или нет.Итак, окончательное изображение.

k = 0,05

enter image description here

Таким образом, оно не является ни высокопериодическим, ни замкнутым.У нас есть какой-то тип аттрактора.Это означает, что в общем случае ваше уравнение ведет себя очень хаотично, и поэтому оно не стоит ни копейки.Конечно, в вашем точном заданном диапазоне параметров может вести себя как линейная функция.Но бесконечно малый отрезок круга также собирает линию, что это значит?Ничего такого.Вы не можете полагаться на очень определенный диапазон ввода.Если ваша бизнес-единица изменит требования хотя бы чуть-чуть - поведение вашего уравнения сильно изменится.Таким образом, единственный разумный шаг - вытащить его из окна и пересоздать другую - на этот раз стабильную - модель для данных.Или просто заявить, что это не может быть сделано.

1 голос
/ 04 июня 2019

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

y = a * sinh (b * x + c * y + d)

Обратите внимание, что это идет с некоторыми ненулевыми допущениями по A, B, C, D

b * x + c * y + d = arcsinh (y / a)

arcsinh можно переписать, используя натуральный логарифм : b * x + c * y + d = ln (y / a + sqrt ((y / a) ** 2 + 1)))

Это дает:

x = (1 / b) * (ln (y / a + sqrt ((y / a) ** 2 + 1))) - c * y - d)

Затем вы можете построить это для различных значений a, b, c, d.

...