使用numpy或scipy优化sympy代码的运行时

2024-04-27 05:32:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我是编程新手,这是我在这里的第一个问题。我在这个问题上花了很多时间。这是我为论文写的一个节目的摘要。也许这对你们这些专家来说微不足道,但我甚至可能缺乏数学知识。在

我想解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的方程。如果我什么都不清楚,请尽管问。在


Tags: import编程np时间sincos解决方案节目
1条回答
网友
1楼 · 发布于 2024-04-27 05:32:55

如果我修复了numpy示例中缺少的括号,则会得到不同的结果:

In [40]: b1,b2,c3
Out[40]: (0.21407625679722384, 2.8598524043642226, 0.4463029985826017)

不管怎样,你的输入点不是很好,因为你的变量是混淆的。您的函数是按b1,b2,c3顺序定义的,但是起点对应于c3,b1,b2的符号解。改变顺序让我

^{pr2}$

注意,对于给定的b1,b2你也会得到一个b1+2*k*pi,b2*2*l*pi的解,其中k,l是整数。在

我没有把这些数字加到你的方程式里,但我很肯定它们能解出来。问题是,有很多解决办法。正如我所说的,你的前两个变量是周期性的,即使这样,也可能有很多其他的c3的解。如果您对fsolve使用一系列不同的起点,您将得到一堆不同的解决方案。在

更糟糕的是:您的解决方案没有实施0<c3<1边界。在


数学方面:由于可能解的多样性,你可以先在纸上简化数值问题。在

例如,第一个方程是特殊的,因为它不包含c3。您可以将b1与{}关联起来,尽管这是一种非线性的方式。对于每一个b1,你会知道的

b2=+-acos(0.0166-cos(b1))+2*k*pi

这已经是一个约束。此外,将等式1加到等式3中,可以得到

^{4}$

换句话说,c3cos(b1)线性相关。如果你把它引入等式2中,得到b1b2函数之间的连接,可能会有所帮助。本质上,你有变量作为b1,b2(b1),c3(b1),用一个等式2来求解。在

另一个注意事项:我猜大量的方程来自于方程中数值因子的大量组合。对吗?如果是这样,您可能需要在方程中引入一些符号常量,而不是浮点字面值,并尝试解决这个问题。如果你成功了,你不必解大量的非线性方程组:你只需要解一组,然后用你的各种参数代替。在

相关问题 更多 >