我希望从两个非线性方程中得到一些解(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)
答案 0 :(得分:0)
我认为错误可能在于你使用反向触发功能(如arccos(acos),arcsin(asin))。一些反向触发函数具有域,如果恰好插入的值是该域之外的值,则会导致域错误。
以下是每个反向触发功能的域(R =所有实际值):
因此,解决方案是在可以输入到反(弧)函数的参数上设置某种界限。或者您可以尝试使用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
的定义中有错误,但你不能轻易找到它,我会建议查看它的各个部分:分别定义和绘制它们,看看哪些是你期望的,哪些不是。