簡體   English   中英

使用python求解非線性方程

[英]using python to solve a nonlinear equation

我從未使用過python,但Mathematica無法處理我要解決的方程式。 我正在嘗試求解以下方程式的變量“ a”,其中s,c,mu和delt t是已知參數。

在此處輸入圖片說明

我嘗試在Mathematica中執行NSolve,Solve等,但是已經運行了一個小時,沒有運氣。 由於我不熟悉Python,有沒有一種方法可以使用Python來解決此方程?

你不會找到一個解析解這些方程,因為他們是超然的,包含a內部和三角函數之外。

我認為您在使用數字解決方案時遇到的麻煩是a的可接受值范圍受arcsin約束。 由於arcsin僅為-1和1之間的參數定義(假設您希望a為實數),因此您的alphabeta公式要求a > s/2a > (sc)/2

在Python中,您可以使用brentq函數找到第三個方程的零(以f(a) = 0的形式重寫):

import numpy as np
from scipy.optimize import brentq

s = 10014.6
c = 6339.06
mu = 398600.0
dt = 780.0
def f(a):
    alpha = 2*np.arcsin(np.sqrt(s/(2*a)))
    beta = 2*np.arcsin(np.sqrt((s-c)/(2*a)))
    return alpha - beta - (np.sin(alpha)-np.sin(beta)) - np.sqrt(mu/a**3)*dt

a0 = max(s/2, (s-c)/2)
a = brentq(f, a0, 10*a0)

編輯:

為了闡明brentq(f,a,b)工作方式,是在間隔[a,b]上搜索f的零。 在這里,我們知道a至少是max(s/2, (sc)/2) 我只是猜測10次是合理的上限,並且對給定的參數有效。 更一般而言,您需要確保fab之間改變符號。 您可以在SciPy文檔中閱讀有關該功能如何工作的更多信息。

我認為值得在嘗試解決該功能之前先對其進行研究。 如果不這樣做,您將不知道是否有獨特的解決方案,很多解決方案或沒有解決方案。 (最大的問題是許多解決方案,其中數值方法可能無法為您提供所需/期望的解決方案-如果您盲目使用它,則可能會發生“不好的事情”)。 您可以使用scipy和ipython很好地檢查行為。 這是一個示例筆記本

# -*- coding: utf-8 -*-
# <nbformat>3.0</nbformat>

# <codecell>

s = 10014.6
c = 6339.06
mu = 398600.0
dt = 780.0

# <codecell>

def sin_alpha_2(x):
    return numpy.sqrt(s/(2*x))
def sin_beta_2(x):
    return numpy.sqrt((s-c)/(2*x))
def alpha(x):
    return 2*numpy.arcsin( numpy.clip(sin_alpha_2(x),-0.99,0.99) )
def beta(x):
    return 2*numpy.arcsin( numpy.clip(sin_beta_2(x),-0.99,0.99) )

# <codecell>

def fn(x):
    return alpha(x)-beta(x)-numpy.sin(alpha(x))+numpy.sin(beta(x)) - dt * numpy.sqrt( mu / numpy.power(x,3) )

# <codecell>

xx = numpy.arange(1,20000)
pylab.plot(xx, numpy.clip(fn(xx),-2,2) )

fn圖

# <codecell>

xx=numpy.arange(4000,10000)
pylab.plot(xx,fn(xx))

在此處輸入圖片說明

# <codecell>

xx=numpy.arange(8000,9000)
pylab.plot(xx,fn(xx))

在此處輸入圖片說明

這表明我們期望找到一個介於8000和9000之間的解決方案。曲線中的奇數扭結在約5000處,而較早的解在約4000處,這是由於使反正弦表現為必需的削波。 實際上,在大約a = 5000以下,該方程式沒有任何意義。 (精確值是Rays解決方案中給定的a0)。 然后,這提供了一個很好的范圍,可以與Rays解決方案中的技術一起使用。

暫無
暫無

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

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