繁体   English   中英

如何求解函数y = f(x,y),即函数值取决于自身

[英]How to solve a function y=f(x,y), i.e, the functional value depends on itself

我想在python中解决以下方程式。 问题是因变量“ y”也出现在等式的右侧。 第一个问题,在数学中如何命名这些方程式?

如果我跳过RHS中的“ y”,就可以解决。 但是不知道如何解决将其固定在原位的问题。

在此处输入图片说明

我使用以下代码:从matplotlib导入numpy作为np导入为plt pyplot

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()

此类非线性方程通常以迭代方式求解。 设置y=0 ,求解方程,获取新y ,将新值插入RHS并重复该过程。 跟踪值y(j)-y(j-1)以检查收敛性。 如果未过渡,请尝试将先前的RHS零件与具有一定权重的当前零件混合:RHS(j)= w * RHS(j)+(1-w)RHS(j-1)。 以下是一些有用的链接:

维基

图书:几个变量中非线性方程的迭代解法作者:JM Ortega,WC 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()

在此处输入图片说明

您的方程式可以非常简化,以获得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的各种值绘制此图。

您的函数通常以以下形式称为递归关系

在此处输入图片说明

可以通过数值选择y的起始值进行求解,然后将其放入方程中,然后计算下一个y值。 然后重复计算,将下一个y值作为先前的y值放入方程中。 循环重复计算,直到y值收敛为止。 Y值可能不会收敛。 即使在这种情况下,您也可以进一步分析系统。 您可以尝试绘制图y n = f(y n-1 )并查看得到的结果。 如果系统是稳定的,则曲线必须是高度周期性闭合的 ,否则非收敛系统将是混乱的,这样的方程式您可以抛弃。

稳定系统的一些例子是李沙育曲线

在此处输入图片说明

混沌系统的一些例子是Rossler吸引子

在此处输入图片说明

y = A * sinh(-yC)分析

要查看您的系统是否稳定-让我们尝试使用双曲线正递归关系来调制sin(x)函数: y=k*SIN(x)+0.88*SINH(-y-0.02)并尝试绘制此y=k*SIN(x)+0.88*SINH(-y-0.02) y prev vs y next的递归参数图。

K = 0

在此处输入图片说明

这里没什么好看的,因为在这种情况下,我们得到的原始方程式在数据点之间的分辨率很低。 它们全都沿着一条线分布,并带有一些我们无法用眼睛分辨的小散射-这就是为什么我们在这里需要sin(x)的原因!

K = 0.0005

在此处输入图片说明

更有趣。 现在可以看到,您的“线”根本就不是线,并且具有一些混乱的行为。 但是,让我们看一些更具吸引力的东西。

K = 0.005

在此处输入图片说明

在某些地方,sinh()复发是成功的,但在某些地方-sin()。 让我们尝试强制赢得sin()函数,以便能够查看它是否会定期进行调制以及是否具有闭环。 所以最终的形象。

K = 0.05

在此处输入图片说明

因此,它既不是高度周期性的,也不是封闭的。 我们有某种类型的吸引子。 这意味着,在一般情况下,您的方程式表现得非常混乱,因此不值一分钱。 当然,在您给定的确切参数范围内,它可能表现为线性函数。 但是圆的无穷小段也重新组合了一条线,这是什么意思? 没有。 您不能依赖非常具体的输入范围。 如果您的业务部门会稍微改变需求,则等式的行为将发生巨大变化。 因此,唯一合理的步骤是将其从窗口中移出并重新构建不同的(此时稳定的)数据模型。 或者只是说这是不可能完成的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM