2017-07-28 30 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

相关问题