簡體   English   中英

用python求解同時多元多項式方程

[英]Solving simultaneous multivariate polynomial equations with python

編輯:我得到的方程式參考包含幾個錯誤。 我在這里修好了。 解決方案現在可能真的有意義!

當兩層流體流過地形時,取決於流速的相對大小和流體中的波速,存在許多不同的解決方案。

關鍵流程

這些被稱為“超臨界”,“次臨界”和“關鍵”(前兩個我在這里稱為“超臨界”)。

以下等式定義了(h,U0)參數空間中臨界行為和臨界行為之間的界限:

EQ1

EQ2

我想消除d_1c (即我不在乎它是什么)並在(h, U_0)找到這些方程的解。

簡化因素:

  • 我只需d_0 d_0答案
  • 我不需要精確的解決方案 ,只需要解決方案曲線的概述,因此可以通過分析或數字方式解決。
  • 我只想繪制區域(h,U0)=(0,0)到(0.5,1)。

我想用Enthought分配中的模塊來解決這個問題(numpy,scipy,sympy),但是真的不知道從哪里開始。 消除變量d1c確實讓我感到困惑。

這是python中的方程式:

def eq1(h, U0, d1c, d0=0.1):
    f = (U0) ** 2 * ((d0 ** 2 / d1c ** 3) + (1 - d0) ** 2 / (1 - d1c - d0) ** 3) - 1
    return f

def eq2(h, U0, d1c, d0=0.1):
    f = 0.5 * (U0) ** 2 * ((d0 ** 2 / d1c ** 2) - (1 - d0) ** 2 / (1 - d1c - d0) ** 2) + d1c + (h - d_0)
    return f

我期待一個有許多解決方案分支的解決方案(並不總是物理的,但不要擔心),看起來大致如下:

關鍵政權圖

我該如何實現呢?

半正式地,您要解決的問題如下:給定d0,求解邏輯公式“存在d1c使得eq1(h,U0,d1c,d0)= eq2(h,U0,d1c,d0)=對於h和U0,為0“。

存在一種將公式簡化為多項式方程“P(h,U0)= 0”的算法,它被稱為“量詞消除”,它通常依賴於另一種算法“圓柱代數分解”。 不幸的是,這還沒有在sympy中實現。

但是,由於U0很容易被淘汰,因此您可以通過同情來找到答案。 從...開始

h, U0, d1c, d0 = symbols('h, U0, d1c, d0')
f1 = (U0) ** 2 * ((d0 ** 2 / d1c ** 3) + (1 - d0) ** 2 / (1 - d1c - d0 * h) ** 3) - 1
f2 = U0**2 / 2 * ((d0 ** 2 / d1c ** 2) + (1 - d0) ** 2 / (1 - d1c - d0 * h)) + d1c + d0 * (h - 1)

現在,從f1中消除U0並將值插入f2(我正在“手動”而不是使用solve()來獲取更漂亮的表達式):

U2_val = ((f1 + 1)/U0**2)**-1
f3 = f2.subs(U0**2, U2_val)

f3僅取決於h和d1c。 此外,由於它是一個有理分數,我們只關心它的分子何時變為0,因此我們得到2個變量中的單個多項式方程:

p3 = fraction(cancel(f3))

現在,對於給定的d0,您應該能夠以數字方式反轉p3.subs(d0,.1)以獲得h(d1c),將其插回U0並將(h,U0)的參數圖作為函數的函數D1C。

讓我先討論消除d1c 想象一下,你設法d1c = f(U, h, d0)第一個等式,得到d1c = f(U, h, d0) 然后你將它替換為第二個等式,並在Uhd0之間有一定的關系。 d0固定的情況下,這為兩個變量Uh定義了一個方程,原則上,您可以從中找到任何給定h U 根據您的上一個草圖,這似乎是您所謂的解決方案。 壞消息是,從你的任何一個方程中得到d1c並不容易。 好消息是你不需要。

fsolve可以采用一個方程組,比如說兩個方程依賴於兩個變量並給出解決方案。 在這種情況下:修復hd0已經固定),並輸入到fsolve你擁有的系統,作為變量U0d1c 記錄U0的值,重復下一個h值,依此類推。

請注意,與@duffymo的建議相反,我建議使用fsolve ,或者至少從它開始,並且只有在它耗盡時才尋找其他求解器。

一個可能的警告是,你希望在給定hU0提供多個解決方案: fsolve需要一個初始猜測,並且沒有簡單的方法告訴它收斂到其中一個解決方案分支。 如果結果證明是一個問題,請查看brentq求解器。

另一種方法是觀察您可以輕松地從系統中消除U0 這樣你會得到一個方程的hd1c ,解決它的d1c的每個值h ,然后用您的原始方程來計算U0給出d1ch

使用fsolve一個例子:

>>> from scipy.optimize import fsolve
>>> def f(x, p):
...   return x**2 -p
... 
>>> fsolve(f, 0.5, args=(2,))
array([ 1.41421356])
>>> 

這里args=(2,)是告訴fsolve的語法,如果f(x,2)=0 ,你實際想要解決的是什么,而0.5x值的起始猜測。

您可以使用Newton Raphson或BFGS等非線性求解器來求解同時的非線性方程。 他們對初始條件和對基礎的調節敏感,因此需要一些護理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM