<p>这类非线性方程通常采用迭代法求解。设置<code>y=0</code>,解方程,得到新的<code>y</code>,在RHS中插入新值并重复这个过程。跟踪值<code>y(j)-y(j-1)</code>以检查收敛性。如果它不在边缘,尝试将以前的RHS部分与当前部分混合,并具有一定的权重:RHS(j)=w*RHS(j)+(1-w)RHS(j-1)。以下是一些有用的链接:</p>
<p><a href="https://en.wikipedia.org/wiki/Iterative_method" rel="nofollow noreferrer">wiki</a></p>
<p>书:多变量非线性方程的迭代解法
作者:J.M.Ortega,W.C.Rheinboldt</p>
<p>下面是您的示例:</p>
<pre><code>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()
</code></pre>
<p>对于更大的间隔,它看起来更有趣,注意参数w</p>
<pre><code>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()
</code></pre>
<p><a href="https://i.stack.imgur.com/yvhrk.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/yvhrk.png" alt="enter image description here"/></a></p>