如何求解一个函数y=f(x,y),即函数值取决于它的性质

2024-03-28 18:31:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用python来解下面的方程。问题是,因变量“y”也出现在方程的右侧。第一个问题,这些方程在数学中是如何命名的?你知道吗

如果我跳过RHS中的“y”,我就能解决这个问题。但不知道如何解决保持它的位置。你知道吗

enter image description here

我使用了以下代码: 将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()

Tags: 代码numpymatplotlibdefnpplt数学命名
3条回答

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

wiki

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

enter image description here

您的函数通常称为recurrence relation,形式如下

enter image description here

选择y的起始值进行数值求解,然后将其代入方程,计算出下一个y值。重复计算,将下一个y值作为上一个y值放入方程中。循环重复计算,直到y值收敛。Y值可能不收敛。即使在这种情况下,您也可以进一步分析系统。你可以试着画出图yn=f(yn-1),看看你得到了什么。如果系统是稳定的曲线必须是高度周期的闭合的,否则非收敛系统是混沌的,这样的方程你可以扔出窗口。你知道吗

稳定系统的一些例子是Lissajous curves

enter image description here

混沌系统的一些例子是Rossler attractor

enter image description here

y=A*sinh(-y-C)分析

要查看系统是否稳定,让我们尝试用双曲正弦递推关系来调节sin(x)函数: y=k*SIN(x)+0.88*SINH(-y-0.02)我们试着画这个yprevvs ynext的递推参数图。你知道吗

k=0

enter image description here

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

k=0.0005

enter image description here

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

k=0.005

enter image description here

在某些地方sinh()获胜,但在某些地方-sin()。让我们试着强制sin()函数获胜,看看它是否会被周期性地、闭环地调制。最后一张照片。你知道吗

k=0.05

enter image description here

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

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

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

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

b*x+c*y+d=弧长(y/a)

arcsinh可以使用natural logarithm重写: 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的各种值

相关问题 更多 >