2017-07-28 27 views
2

我希望從兩個非線性方程中獲得一些解(x和y)。 所以我寫了一些代碼,並插入方程,但它不起作用。Python:如何計算2個變量非線性方程或在python中繪製這些方程?

據我所知,問題產生於f2 = math.acos(~~~),即「ValueError:math domain error」 (實際上,當我擦除math.acos並顯示一些錯誤但特定解決方案。)

所以,請問一些幫助知道方法, (1)我如何獲得'f1 =〜','f2 =〜'的某些解作爲x,y。 (2)我如何繪製'sub_equation =〜'和'f1 =〜'的圖。

我真的很想找一些幫助。謝謝。

from scipy.optimize import fsolve 
import math 
import numpy as np 
import matplotlib.pyplot as plt 




###Input### 
Angle = 120.0 
length_Porpyrin =18.6 
length_linker = 12.5 
###parameter### 
length_1 = length_Porpyrin/2.0 
lenght_2 = length_linker/2.0 
delta = np.pi*Angle/180.0/2.0 
ramda = 30.18/180.0*np.pi 
bond_angle = 2.0*np.pi/3.0 
length_d = 1.35 



def equations(p): 
    x,y = p 
    ### modified Variable ### 
    atr1 = np.arctan(length_1/x) 
    atr2 = np.arctan(lenght_2/y) 
    sub_equation = (length_d ** 2+(y/np.cos(np.arctan(lenght_2/y))) ** 2-(x/np.cos(np.arctan(length_1/x))) ** 2)*np.cos(np.arctan(lenght_2/y))/(2 * length_d * y) 
    ########################## 
    f1 = ( (x/np.cos(np.arctan(length_1/x))) ** 2 + (y/np.cos(np.arctan(lenght_2/y))) ** 2 - 2 *(x/np.cos(np.arctan(length_1/x))) * (y/np.cos(np.arctan(length_1/x))) * np.cos(ramda-np.arctan(length_1/x)-np.arctan(lenght_2/y)) ) - length_d ** 2 
    f2 = math.acos(sub_equation) - (bond_angle -(np.pi-np.arctan(lenght_2/y)-delta)) 
    return (f1, f2) 


solution = fsolve(equations, (25,25)) 
radius1 = solution[0] 
radius2 = solution[1] 


print('[solution]') 
print(solution) 
print('radius1', radius1) 
print('radius2', radius2) 

回答

0

我認爲錯誤可能是事實,當你使用逆三角函數(如反餘弦(ACOS),反正弦(ASIN))。一些反向trig函數具有域,如果恰好插入的值超出該域,則會導致域錯誤。

下面是域各逆三角函數的(R =所有實NUMS):

Inverse Trig Function Domains

因此該解決方案將是把某種界對可輸入的參數進入反(弧)函數。或者你可以嘗試使用try塊除外來處理異常。以下是Python文檔:https://docs.python.org/3/tutorial/errors.html(請參閱第8.3節)。

+0

是的,我明白了。我需要將math.acos()的內部項限制爲[-1,1]。但是如何?定義每個方程和變量(x,y)。它犯了一些錯誤。 – Dasol

0

slongo已經解釋了錯誤意味着什麼:math.acos()被調用的參數大於1或小於-1 - 並且這絕不應該發生。

換句話說:嘗試直接繪製sub_equation的值 - 應該始終保持在[-1; 1]之內。如果不這樣做,那麼可能出現錯誤,無論是您的sub_equation的定義,還是您輸入的變量的值。

我假設你對這些方程式和單個術語的含義有了一個概念,所以如果在sub_equation的定義中有錯誤但你不容易找到它,我建議看看它的各個部分:分別定義和繪製它們,看看哪些是你期望的,哪些不是。

+0

謝謝,扎克。是的,我明白了這一點,也許惰性期限應該是[-1,1]。但是,如何..我已經搜索了相當的網頁,但它不起作用。 – Dasol

+0

@Dasol,如果你的等式可以產生[-1,1]之外的數字,那意味着它可能有錯誤。這意味着要麼沒有正確導出,要麼執行錯誤。我的建議是你繪製'sub_equation''並檢查數字是否有意義。 – Zak

相關問題