【问题标题】:How can I speed up my integration program in python?如何加快我在 python 中的集成程序?
【发布时间】:2019-03-09 05:02:18
【问题描述】:

我制作了一个简单的 GUI 来解决用户输入的积分问题,我想知道是否有任何方法可以在不牺牲准确性的情况下加快在我的代码中获取积分的过程?对于小范围来说它非常快,但是当下限和上限变大时,它变得非常低效。

from tkinter import *
import parser
from math import *

def Integrate(eq, a, b):
    code = parser.expr(eq).compile() #parses user string into equation
    dx = 0.0000001
    area = 0.0
    x = a
    x_f = b
    while x <= x_f:
        x += dx
        area += (dx*eval(code))
    answer = float("{0:.5f}".format(area))
    print(answer)

master = Tk()
master.title("Integration Program")

instruction = Label(master, text="Enter f(x): ")
instruction.grid(row=0, column=0)

lower_label = Label(master, text="Lower Bound: ")
lower_label.grid(row=0, column=1)

upper_label = Label(master, text="Upper Bound: ")
upper_label.grid(row=0, column=2)

f_of_x = StringVar()
lwr = StringVar()
upr = StringVar()

entry_f = Entry(master, textvariable=f_of_x, width=20)
entry_f.grid(row=1, column=0)

entry_l = Entry(master, textvariable=lwr, width=5)
entry_l.grid(row=1, column=1)

entry_u = Entry(master, textvariable=upr, width=5)
entry_u.grid(row=1, column=2)

go = Button (master, text = "Integrate",
             command= lambda: Integrate(f_of_x.get(),
                                    float(lwr.get()), 
float(upr.get())))
go.grid(row=2, column=1)
mainloop()

【问题讨论】:

标签: python-3.x computer-science integral


【解决方案1】:

正如 c2huc2hu 在 cmets 中所指出的,您可以使用不同的数值积分方法。已经编写了整本关于数值分析的书籍来描述不同的选项,并且在任何特定情况下最合适。

另一个值得考虑的选项 - 当研究人员真正想要解决大型计算问题时经常考虑 - 是并行化。欧拉的方法,这似乎本质上是你正在做的(基本上使用有限黎曼和来近似定积分)是可笑的平行:你可以将范围 [a, b] 分解为你想要的多个子范围,并有一个单独的处理器解决每一个。现在,如果您在单个 CPU 内核上运行,这不会为您带来任何好处并增加开销。但是,如果你有一个多核 CPU——我想现在所有 CPU 都有多个核——你可以通过使用所有可用的并行管道来接近这种计算的正比加速。

现在考虑使用 GPU 之类的东西,您可以在其中使用数百个内核。您可以在 CUDA 中编写上述集成,而带有普通 NVIDIA 显卡的 PC 可以比单线程 CPU 应用程序快数百倍地解决您的问题。所有这一切都没有——或者,如果你在 GPU 上使用单点,可能仍然可以容忍——精度损失。并行代码会是什么样子?

dx = <const>
xi = <const>
xf = <const>

pt = floor((xf - xi) / dx)

tc = <const>
tl = ()

for n = 1 to tc do
    pt_start = floor(pt / tc) * (n - 1) + 1
    pt_stop = floor(pt / tc) * n
    x_start = xi + (pt_start - 1) * dx
    x_stop = xi + (pt_stop - 1) * dx
    if n = tc then x_stop = xf
    tl.add(new job(x_start, x_stop))

for n = 1 to tc do
    tl(n).start()

for n = 1 to tc do
    tl(n).join()

sum = 0
for n = 1 to tc do
    sum = sum + tl(n).result

return result

请注意,在后台并行运行的job 函数只需使用您编写的方法将函数从x_start 集成到x_stop

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-27
    • 2021-01-11
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多