Python:如何计算2变量非线性方程或在Python中将这些方程绘制在图形上?
我希望从两个非线性方程中得到一些解(x和y)。 所以我写了一些代码,插入了方程,但它不起作用 据我所知,问题是在f2=math.acos(~~~~)处生成的,即“ValueError:math domain error” (实际上,当我删除math.acos时,它们会显示一些错误但具体的解决方案。) 所以,我想请你帮我指路, (1) 我是如何得到‘f1=~’,‘f2=~’作为x,y的某些解的。 (2) 我如何为‘子方程=~’和‘f1=~’绘制一些曲线图 我真的在寻求帮助。多谢各位Python:如何计算2变量非线性方程或在Python中将这些方程绘制在图形上?,python,math,Python,Math,我希望从两个非线性方程中得到一些解(x和y)。 所以我写了一些代码,插入了方程,但它不起作用 据我所知,问题是在f2=math.acos(~~~~)处生成的,即“ValueError:math domain error” (实际上,当我删除math.acos时,它们会显示一些错误但具体的解决方案。) 所以,我想请你帮我指路, (1) 我是如何得到‘f1=~’,‘f2=~’作为x,y的某些解的。 (2) 我如何为‘子方程=~’和‘f1=~’绘制一些曲线图 我真的在寻求帮助。多谢各位 from sc
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)
我认为错误可能在于,当您使用反向触发器函数(如arccos(acos)、arcsin(asin))时。某些反向触发器函数具有域,如果碰巧插入了一个值,即该值超出了该域,则将导致域错误 以下是每个反向触发函数的域(R=所有实NUM):
因此,解决方案是对可以输入到反(弧)函数中的参数设置某种界限。或者可以尝试使用try-except块处理异常。下面是Python文档:
https://docs.python.org/3/tutorial/errors.html
(请参阅第8.3节)。斯隆戈已经解释了错误的含义:math.acos()
是使用大于1或小于-1的参数调用的,这种情况永远不会发生
换句话说:尝试直接绘制子方程
的值——该值应始终保持在[-1;1]范围内。如果没有,那么可能是出了问题,或者是你对子方程的定义有问题,或者是你输入的变量值有问题
我假设你知道这些方程和各个术语的含义,因此如果sub_方程的定义有错误,但你不容易找到,我建议你看看它的各个部分:分别定义和绘制它们,看看哪些是你期望的,哪些不是。谢谢你,扎克。是的,我明白了,也许惰性项应该限制在[-1,1]。但是,如何。。我已经搜索了相当多的网页,但它不起作用。@Dasol,如果你的方程式可以产生一个超出[-1,1]的数字,这意味着它可能有错误。这意味着它要么没有正确地派生,要么实现错误。我的建议是你画出子方程,然后检查这些数字是否有意义。是的,我明白了。我需要将math.acos()的内部项绑定到[-1,1]。但是怎么做呢?定义每个方程和变量(x,y)。它会犯一些错误。