说,我们有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 不是很流利。
怎么可能做到这一点?