簡體   English   中英

求解python中的非線性方程

[英]Solve nonlinear equation in python

我試圖找到介質波導的基本TE模式。 我嘗試解決它的方法是計算兩個函數並嘗試在圖上找到它們的交集。 但是,我在繪制情節時遇到了交叉點。 我的代碼:

def LHS(w):
    theta = 2*np.pi*1.455*10*10**(-6)*np.cos(np.deg2rad(w))/(900*10**(-9))
    if(theta>(np.pi/2) or theta < 0):
        y1 = 0
    else:
        y1 = np.tan(theta)
    return y1

def RHS(w):
    y = ((np.sin(np.deg2rad(w)))**2-(1.440/1.455)**2)**0.5/np.cos(np.deg2rad(w))
    return y

x = np.linspace(80, 90, 500)

LHS_vals = [LHS(v) for v in x]
RHS_vals = [RHS(v) for v in x]


# plot
fig, ax = plt.subplots(1, 1, figsize=(6,3))
ax.plot(x,LHS_vals)
ax.plot(x,RHS_vals)
ax.legend(['LHS','RHS'],loc='center left', bbox_to_anchor=(1, 0.5))

plt.ylim(0,20)
plt.xlabel('degree')
plt.ylabel('magnitude')
plt.show()

我有這樣的情節: 圖形

交叉點大約是89度,但是,我無法計算x的精確值。 我試過fsolve,求解找到解決方案,但仍然徒勞無功。 如果它不是唯一的解決方案,它似乎無法打印出解決方案。 是否有可能只找到x在一定范圍內的解? 有人可以在這里給我任何建議嗎? 謝謝!

編輯:方程式是這樣的(m = 0): 在此輸入圖像描述

我試圖通過找到交叉點來解決這個問題

編輯:我嘗試的方式之一是這樣的:

from scipy.optimize import fsolve
def f(wy):
   w, y = wy
   z = np.array([y - LHS(w), y - RHS(w)])
   return z

fsolve(f,[85, 90])

但它給了我錯誤的答案。 我也嘗試過這樣的事情:

import matplotlib.pyplot as plt

x = np.arange(85, 90, 0.1)
f = LHS(x)
g = RHS(x)

plt.plot(x, f, '-')
plt.plot(x, g, '-')

idx = np.argwhere(np.diff(np.sign(f - g)) != 0).reshape(-1) + 0
plt.plot(x[idx], f[idx], 'ro')
print(x[idx])
plt.show()

但它顯示:ValueError:具有多個元素的數組的真值是不明確的。 使用a.any()或a.all()

快速和(非常)臟的東西似乎RHS_vals = [RHS(v) for v in x] (至少它給你的參數的值為89) - 在圖之前的代碼中添加以下代碼,在RHS_vals = [RHS(v) for v in x] line之后:

# build a list of differences between the values of RHS and LHS
diff = [abs(r_val- l_val) for r_val, l_val in zip(RHS_vals, LHS_vals)]

# find the minimum of absolute values of the differences
# find the index of this minimum difference, then find at which angle it occured
min_diff = min(diff)
print "Minimum difference {}".format(min_diff)
print "Theta = {}".format(x[diff.index(min_diff)])

我看了85-90的范圍:

x = np.linspace(85, 90, 500)

首先,您需要確保該函數可以實際處理numpy數組。 使用np.linspace()Plot Discrete Distribution中顯示了幾個用於定義分段函數的選項。 例如

def LHS(w):
    theta = 2*np.pi*1.455*10e-6*np.cos(np.deg2rad(w))/(900e-9)
    y1 = np.select([theta < 0, theta <= np.pi/2, theta>np.pi/2], [np.nan, np.tan(theta), np.nan])
    return y1

這已經允許使用第二種方法,在索引處繪制一個點,該點最接近兩條曲線之間的差值的最小值。

import numpy as np
import matplotlib.pyplot as plt

def LHS(w):
    theta = 2*np.pi*1.455*10e-6*np.cos(np.deg2rad(w))/(900e-9)
    y1 = np.select([theta < 0, theta <= np.pi/2, theta>np.pi/2], [np.nan, np.tan(theta), np.nan])
    return y1

def RHS(w):
    y = ((np.sin(np.deg2rad(w)))**2-(1.440/1.455)**2)**0.5/np.cos(np.deg2rad(w))
    return y

x = np.linspace(82.1, 89.8, 5000)
f = LHS(x)
g = RHS(x)

plt.plot(x, f, '-')
plt.plot(x, g, '-')

idx = np.argwhere(np.diff(np.sign(f - g)) != 0).reshape(-1) + 0
plt.plot(x[idx], f[idx], 'ro')
plt.ylim(0,40)
plt.show()

在此輸入圖像描述

然后,人們可以使用scipy.optimize.fsolve來獲得實際的解決方案。

idx = np.argwhere(np.diff(np.sign(f - g)) != 0)[-1]

from scipy.optimize import fsolve

h = lambda x: LHS(x)-RHS(x)
sol = fsolve(h,x[idx])

plt.plot(sol, LHS(sol), 'ro')
plt.ylim(0,40)
plt.show()

暫無
暫無

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

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