我有一个类似
的功能 f(a, b, s) = arctan(cos(a + b) * csc(a - b) * cot(s))
我知道它在某些地方是不连续的,并且可以通过改变功能来“治愈”不连续性。在这种情况下,我知道这些不连续性在哪里,并且它们很容易正确对待它们。基本上它只是
s_discontinuities = [s_0, s_1, s_2]
for i in s_discontinuities:
jump = round(f(a, b, s_discontinuities(i) + Ds) - f(a, b, s_discontinuities(i) - Ds))
offset(i) = jump
def new_f(a, b, s):
exit = 0
for i in s_discontinuities:
if s > s_discontinuities(i):
exit += offset(i)
return f(a, b, s) + exit
然后与a
和b
相同。第一个问题是:有没有办法让算法更有效率,是否有任何算法可以在我不知道不连续性在哪里的情况下工作?
UPDATE 我忘了指定我允许任何给定函数的epsilon(y中的间距)和delta(x中的间距)(如果f(x + delta)> f(x)+ epsilon,然后是不连续的),加上域是有限的。
答案 0 :(得分:1)
一旦找到不连续点的位置,就可以创建一个数组cumulativeOffset [i],其中cumulativeOffset [0] = offset [0],cumulativeOffset [1] = offset [0] + offset [1],等等上。然后,一旦找到了您应该在cumulativeOffset中的位置,您只需要进行一次查找和添加。您可以使用http://en.wikipedia.org/wiki/Binary_search找到您应该在cumulativeOffset []中的位置。
找到一般函数的不连续性至少与查找一般函数的零一样困难,因为f(x)的零点变为1 / f(x)中的不连续性。