![](/img/trans.png)
[英]Scipy interp2d function produces z = f(x,y), I would like to solve for x
[英]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吸引子 :
要查看您的系統是否穩定-讓我們嘗試使用雙曲線正遞歸關系來調制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.