我想在python中解决以下方程式。问题是因变量“ y”也出现在等式的右侧。第一个问题,这样的方程在数学中如何命名?
如果我跳过RHS中的“ y”,我可以解决它。但是不知道如何解决将其固定在原位的问题。
我使用了以下代码: 将numpy导入为np 从matplotlib导入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()
答案 0 :(得分:4)
这类非线性方程通常以迭代方式求解。设置y=0
,求解方程式,获取新的y
,将新值插入RHS,然后重复该过程。跟踪值y(j)-y(j-1)
以检查收敛。如果未过渡,请尝试将先前的RHS零件与具有一定权重的当前零件混合:RHS(j)= w * RHS(j)+(1-w)RHS(j-1)。以下是一些有用的链接:
Book:几个变量中的非线性方程的迭代解 J. M. Ortega,W。C. Rheinboldt
这是您修改的示例:
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()
答案 1 :(得分:1)
您的方程可以非常简化,以获得 x 作为 y 的函数。首先,我们可以按如下方式重写您的方程式:
y = a * sinh(b * x + c * y + d)
请注意,这带有一些关于A,B,C,D的非零假设
b * x + c * y + d = arcsinh(y / a)
可以使用natural logarithm重写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的各种值绘制此图。
答案 2 :(得分:1)
您的函数通常以
的形式称为recurrence relation可以通过数值选择y的开始值求解,然后将其放入方程中,计算下一个y值。然后重复计算,将下一个y值作为先前的y值放入方程中。循环重复计算,直到y值收敛为止。 Y值可能不会收敛。即使在这种情况下,您也可以进一步分析系统。您可以尝试绘制图y n = f(y n-1 )并查看得到的结果。如果系统稳定曲线必须是高度周期且闭合的曲线,否则非收敛系统将是混乱的,这样的方程式您可以抛弃窗口。
稳定系统的一些示例是Lissajous curves:
一些混沌系统的例子是Rossler attractor:
要查看您的系统是否稳定-让我们尝试使用双曲线正态复发关系来调制sin(x)
函数:
y=k*SIN(x)+0.88*SINH(-y-0.02)
,然后尝试绘制y prev 与y next 的递归参数图。
k = 0
在这里看不到太多,因为在这种情况下,我们得到的原始方程式在数据点之间的分辨率很低。它们全部沿着一条线分布,并带有一些我们无法用眼睛分辨的小散射-这就是为什么我们在这里需要sin(x)的原因!
k = 0.0005
更有趣。现在可以看到,您的“线”根本就不是线,并且具有一些混乱的行为。但是,让我们看一些更具吸引力的东西。
k = 0.005
在某些地方,sinh()重复执行成功,但在某些地方-sin()。让我们尝试强制赢得sin()函数,以便能够查看它是否会定期进行调制以及是否具有闭环。就是最后一张图片。
k = 0.05
因此,它既不是高度周期性的,也不是封闭的。我们有某种类型的吸引子。这意味着,在一般情况下,您的方程式表现得非常混乱,因此不值一分钱。当然,在您给定的确切参数范围内,它可能表现为线性函数。但是圆的无穷小段也重新组合了一条线,这是什么意思?没有。您不能依赖非常具体的输入范围。如果您的业务部门会一点点改变-方程式的行为将发生巨大变化。 因此,唯一合理的步骤是将其从窗口中移出并重新构建不同的(此时稳定的)数据模型。或者只是说这是不可能完成的。