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

Python 如何求解函数y=f(x,y),即函数值取决于函数本身,python,linear-algebra,nonlinear-optimization,nonlinear-functions,Python,Linear Algebra,Nonlinear Optimization,Nonlinear Functions,我想用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

我想用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()

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

书:多变量非线性方程的迭代解法 作者: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()

你的方程可以非常简化,得到x作为y的函数。首先,我们可以将你的方程式改写如下:

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

请注意,这附带了一些关于A、B、C、D的非零假设

b*x+c*y+d=弧长(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值可能不收敛。即使在这种情况下,您也可以进一步分析系统。您可以尝试绘制图yn=f(yn-1)并查看得到的结果。若系统是稳定的曲线必须是高度周期和闭合的,否则非收敛系统是混沌的,这样的方程你们可以扔出窗口

稳定系统的一些示例包括:

混沌系统的一些例子有:

y=A*sinh(-y-C)分析 要查看系统是否稳定-让我们尝试使用双曲正弦递推关系调节
sin(x)
函数:
y=k*SIN(x)+0.88*SINH(-y-0.02)
让我们尝试绘制yprev与ynext的递归参数图

k=0

这里没什么可看的,因为在这个例子中,我们得到了原始方程,它在数据点之间的分辨率非常低。它们都是沿着某条线排列的,有一些我们用眼睛无法分辨的微小散射——这就是为什么我们需要sin(x)的原因

k=0.0005

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

k=0.005

在某些地方sinh()循环获胜,但在某些地方-sin()循环获胜。让我们尝试强制sin()函数获胜,看看它是否会被周期性地、闭环地调制。所以最后的图像

k=0.05

所以,它既不是高度周期性的,也不是封闭的。我们有某种类型的吸引子。这意味着,在一般情况下,你的方程表现得非常混乱,因此一文不值。当然,在精确给定的参数范围内,它可能表现为线性函数。但是,一个圆的极小部分也会重新组合一条线,这意味着什么?没有什么。你不能依赖一个非常具体的输入范围。如果您的业务部门将改变需求,那么您的等式的行为将发生剧烈的变化。
因此,唯一合理的步骤是从窗口外通过它,为数据重新构建不同的——这次是稳定的——模型。或者只是说这是不可能的

当y=0时会发生什么?为什么不将y移到另一个方向,并解出等式=0:python不会仅用func@user8426627我想Alam在问如何定义一个函数来解决这样的问题。Alam,解决这类问题的典型方法是给y一个初始值,然后迭代多次,直到收敛到你期望的答案。确定会收敛吗?我不知道它是如何收敛的,请简单解释,我将在你定义的区间内编写函数,它看起来像一个线性函数。设x=3,y=0,因为t=(e^t-e^-t)/2,t=(3/1.3-0.25)/1.25=1.64,e^1.64=5-0.19~5>3,更多的是更大的数字,它不会收敛,或者今天我很愚蠢?这不是一个函数,它是一条代数曲线(所有函数都可以是代数曲线,但反之亦然)。您要求绘制满足方程y-bla(x,y)=0的所有点(x,y)。不需要任何东西来收敛。第一步是通过使用容忍度而不是等式,通过蛮力找到一组(x,y)。接下来的步骤是更复杂的方法(有很多,见富尔顿的书)。它会收敛到w=0.99999999谢谢你揭穿了这个具体的问题。但是我想问一个一般性问题,关于不能转换成y=f(x)或其他形式的一般性问题。也许我应该编辑一下这个问题。