Python:如何计算2变量非线性方程或在python中绘制图形方程?

时间:2017-07-28 15:15:44

标签: python math

我希望从两个非线性方程中得到一些解(x和y)。 所以我写了一些代码,然后插入方程式,但它不起作用。

据我所知,问题是在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)

2 个答案:

答案 0 :(得分:0)

我认为错误可能在于你使用反向触发功能(如arccos(acos),arcsin(asin))。一些反向触发函数具有域,如果恰好插入的值是该域之外的值,则会导致域错误。

以下是每个反向触发功能的(R =所有实际值):

Inverse Trig Function Domains

因此,解决方案是在可以输入到反(弧)函数的参数上设置某种界限。或者您可以尝试使用try except块来处理异常。以下是Python文档:https://docs.python.org/3/tutorial/errors.html(转到8.3节)。

答案 1 :(得分:0)

slongo已经解释了错误的含义:使用大于1或小于-1的参数调用math.acos() - 这应该永远不会发生。

换句话说:尝试直接绘制sub_equation的值 - 应该始终保持在[-1; 1]之内。如果没有,则可能存在错误,无论是您对sub_equation的定义,还是您放入其中的变量的值。

我假设你已经知道这些方程式和各个术语的含义是什么,所以如果sub_equation的定义中有错误,但你不能轻易找到它,我会建议查看它的各个部分:分别定义和绘制它们,看看哪些是你期望的,哪些不是。