0

说,我们有f(t) = v * t + A * sin(w * t)。我称这些功能为“锯状”: 在此处输入图像描述

我要解决saw(t) = C,也就是找一个根saw(t) - C(还是“锯状”)。

我试着写下函数的三元搜索abs(saw(t) - C)来找到它的最小值。如果我们幸运(或狡猾),那将是根源。不幸的是,我的代码并不总是有效:有时我们会卡在那些地方:

在此处输入图像描述

我的代码(python3):

def calculate(fun):
    eps = 0.000000001
    eps_l = 0.1
    x = terns(fun, 0, 100000000000000)
    t = terns(fun, 0, x)
    cnt = 0
    while fun(x) > eps:
        t = x
        x = terns(fun, 0, t)
        if abs(t - x) < eps_l:
            cnt += 1
        # A sorry attempt  pass some wrong value as a right one. 
        # Gets us out of an infinite loop at least.
        if cnt == 10:
            break
    return t

def terns(f, l, r):
    eps = 0.00000000001
    while r - l > eps:
        x_1 = l + (r - l) / 3
        x_2 = r - (r - l) / 3

        if f(x_1) < f(x_2):
            r = x_2 
        else:
            l = x_1
    return (l + r) / 2

那么,它是如何完成的呢?使用三元搜索是否正确?


我的另一个想法是以某种方式将方程发送到网络,将其传递给Wolfram Alpha并获取答案。然而,我不知道它是如何完成的,因为我对 python 不是很流利。

怎么可能做到这一点?

4

0 回答 0