Такие нелинейные уравнения часто решаются итерационным способом. Установите 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](https://i.stack.imgur.com/yvhrk.png)