我是编程新手,这是我在这里的第一个问题。我在这个问题上花了很多时间。这是我为论文写的一个节目的摘要。也许这对你们这些专家来说微不足道,但我甚至可能缺乏数学知识。在
我想解b1,b2和c3的下列方程组:
0 = cos(b1)+ cos(b2)- 0.0166
0 = sin(b1)+ sin(b2)+ 0.3077*c3 - 0.6278
0 = cos(b1)- cos(b2)+ 5.4155*c3 - 4.3547
b1和b2是角度,因此应在[0,2*pi]之间,c3应在[0,1]之间,但这不是必需的。我可以稍后过滤结果。在
我用sympy找到了一个解决方案:
^{pr2}$[{c3:-0.4634,b1:2.7245,b2:0.3739}]
结果是合理的,但不幸的是,这导致了6s的计算时间,这将导致我的程序的总计算时间超过7h。请帮我找到一个更快的解决方案。我试过了
from scipy.optimize import fsolve
import numpy as np
def equations(p):
b1, b2, c3 = p
return (np.cos(b1)+np.cos(b2)-0.0166, np.sin(b1)+np.sin(b2)+0.3077*c3-0.6278,np.cos(b1)-np.cos(b2)+5.4155*c3-4.3547)
b1, b2, c3 = fsolve(equations, (-0.4634, 2.7245, 0.3739))
这导致1s以下的输入(-9.8418e-14,5.6621e-15,-7.5495e-14)。我不知道哪个数字属于哪一个变量,但它们无论如何都没有任何意义。另一个选择是优化最小c3的方程。如果我什么都不清楚,请尽管问。在
如果我修复了
numpy
示例中缺少的括号,则会得到不同的结果:不管怎样,你的输入点不是很好,因为你的变量是混淆的。您的函数是按
^{pr2}$b1,b2,c3
顺序定义的,但是起点对应于c3,b1,b2
的符号解。改变顺序让我注意,对于给定的
b1,b2
你也会得到一个b1+2*k*pi,b2*2*l*pi
的解,其中k,l
是整数。在我没有把这些数字加到你的方程式里,但我很肯定它们能解出来。问题是,有很多解决办法。正如我所说的,你的前两个变量是周期性的,即使这样,也可能有很多其他的
c3
的解。如果您对fsolve
使用一系列不同的起点,您将得到一堆不同的解决方案。在更糟糕的是:您的解决方案没有实施
0<c3<1
边界。在数学方面:由于可能解的多样性,你可以先在纸上简化数值问题。在
例如,第一个方程是特殊的,因为它不包含}关联起来,尽管这是一种非线性的方式。对于每一个
c3
。您可以将b1
与{b1
,你会知道的这已经是一个约束。此外,将等式1加到等式3中,可以得到
^{4}$换句话说,
c3
与cos(b1)
线性相关。如果你把它引入等式2中,得到b1
和b2
函数之间的连接,可能会有所帮助。本质上,你有变量作为b1,b2(b1),c3(b1)
,用一个等式2来求解。在另一个注意事项:我猜大量的方程来自于方程中数值因子的大量组合。对吗?如果是这样,您可能需要在方程中引入一些符号常量,而不是浮点字面值,并尝试解决这个问题。如果你成功了,你不必解大量的非线性方程组:你只需要解一组,然后用你的各种参数代替。在
相关问题 更多 >
编程相关推荐