[英]Invert a 2D --> 2D non-linear function
如果這是在這里寫問題的一種不尋常的方式,我很抱歉,因為它的 scope 似乎很大(對我來說)。 我很高興被引導到已經完成我需要的預定義包,確實我希望(應該?)我的問題有一個標准化的解決方案。 我想知道那里是否有任何幫助? 我還在通過我正在做的一個項目學習Python,我覺得我在某些方面有點弱......
好的,這里是:我想在 python 中反轉 2D --> 2D function,但我的努力都沒有成功。
假設我在(非線性)方程組中有兩個關系,所以
a = f(x,y)
b = g(x,y)
其中 f 和 g 都是連續且可逆的,並且 x 和 y 具有一定的預定義矩形域。 a 和 b 也有自己的矩形域,但與 x 和 y 不同。
關於 f 和 g 的一些額外信息:其中一個函數將是線性的,我們稱之為 f。 因此,a = f(x,y) = q x + p y + r(其中 q、p 和 r 是已知常數)。 在 Python 術語中,我猜你會寫 a[ i, j ] = q x[ i ] + p y[ j ]。 另一個 function,g,沒有解析表達式,但看起來類似於 k sin(x) + l sin(y),因為 x 和 y 在 0 和 pi/2 之間。
此外,我希望制作 3D 表面 plot 的整體“母功能”,將 a 和 b 設為 arguments。 調用母親 function M,我們得到 M = M(a,b) = M(f(x,y),g(x,y))。 到目前為止,一切都很好。
問題的本質是我需要首先在“母網格”上選擇一對(a,b),然后找到產生這個特定(a,b)的對應對(x,y)。 但是, f 和 g 沒有任何分析上的“簡單”逆,我需要在數字上找到這些。
所以基本問題是, “給定 a[ i ] 和 b[ j ] 作為兩個排序列表,並給定用於獲取 a 和 b 的 x[ ii ] 和 y [ jj ],我如何找到兩個逆函數 x = inv1 (a,b) 和 y = inv2 (a,b)?"
PS。 我已經嘗試了通過首先選擇(x,y)對,計算暫定(A,B)對,然后將其插入到預定義的(a,b)網格中的“廉價方法”我可以。 然而,由於(x,y)網格和(a,b)網格(相當)不同,相應的“擬合錯誤”總是使最終結果呈現鋸齒狀和混亂(我有一個控制場景,我知道什么在做我自己的案例之前,最終結果應該是這樣的)。 這是因為如果有意義的話,我實際上是在將 A 和 B 的值強制到 position (a,b) 處的 M function 的高度上。 我已經嘗試對此進行平均和平滑“作弊”,但它仍然無法通過 imo。 因此,我真的需要先選擇一個 (a,b) 對,然后再找到相關的 (x,y) 對。
注意:M 函數中的一些參數直接取決於 x 和 y,因此需要知道 x 和 y 的確切值。
感謝您的附加信息。 我認為您可以直接解決此問題,然后再進行分析。
從你的最終結果開始(a, b)
:
首先解決a
以找到您的 xy 線,例如:
a = qx + py + r
y = (qx + r - a) / -p
既然你說它是單調遞增的,為了簡單起見,我只是求解y
。
接下來,使用跨x
的簡單二進制搜索將其插入您的非分析g
:
def invert(a, b):
def get_y(x):
return (Q * x + R - a) / -P
def g_constrained(x):
return g(x, func(x))
x = binary_search(g_constrained, b, min_x, max_x, guess_x)
y = get_y(x)
return x, y
請注意,您的 function 通常不能保證有一個單一的解決方案,考慮一個看起來像弧的g
平面解決方案,因為f
是一條線,您可以有兩個交點。 您需要決定如何處理這些信息。
以前的擔憂
我懷疑您聲稱a = f(x,y)
是連續且可逆的。
簡而言之:如果您的 function z = f(x, y)
沒有與平面z = K
相交於每個K
的一個點,則它不是 invertible 。
一個詳細的例子:
考慮一些點,以及它周圍的 4 個點——為了方便起見,這里我使用(0,0)
和單位長度。
z = f(0,0)
a = f(-1,0)
b = f(1,0)
p = f(0,-1)
q = f(0,1)
如果f
提供一個標量值(或任何x < y
和y < z
暗示x < z
的值),那么我們就有問題了。
由於f
是連續且可逆的,因此a < z < b
或b < z < a
,對於p
和q
也是如此。 所以f-inv(z+)
會將 map 轉換為兩個不同的值,一個在(-1, 0) -> (1, 0)
行上,一個在(0, -1) -> (0, 1)
行上。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.