我想获得一些复杂函数的准确近似值(pow, exp, log,log2比 C++ 标准库中 cmath 提供的函数更快地
为此,我想利用浮点编码方式并使用位操作获取指数和尾数,然后进行多项式近似。尾数在 1 和 2 之间,因此我使用 n 阶多项式来近似 [1, 2] 中域 x 中的目标函数,并对浮点表达式进行位操作和简单数学运算以使计算有效。
我用来np.polyfit生成多项式。作为示例,以下是我用来在 1 <= x <= 2 上近似 log2 的 7 阶多项式:
P = np.array(
[
0.01459855,
-0.17811046,
0.95074541,
-2.91450247,
5.67353733,
-7.39616658,
7.08511059,
-3.23521156,
],
dtype=float,
)
Run Code Online (Sandbox Code Playgroud)
要应用多项式,请将第一项乘以 x 的 7 次方,第二项乘以 x 的 6 次方,依此类推...
在代码中:
P[0] * x**7 + P[1] * x**6 + P[2] * x**5 + P[3] * x**4 + P[4] …Run Code Online (Sandbox Code Playgroud) 考虑 SymPy 符号e和 的两个函数i:
from sympy import Symbol, expand, Order
i = Symbol('i')
e = Symbol('e')
f = (i**3 + i**2 + i + 1)
g = (e**3 + e**2 + e + 1)
z = expand(f*g)
Run Code Online (Sandbox Code Playgroud)
这将产生
z = e**3*i**3 + e**3*i**2 + e**3*i + e**3 + e**2*i**3 + e**2*i**2 + e**2*i + e**2 + e*i**3 + e*i**2 + e*i + e + i**3 + i**2 + i + 1
Run Code Online (Sandbox Code Playgroud)
然而,假设e和i都很小,我们可以忽略三阶或更高阶的两个项。使用 …
我愿意实现一种算法,以最有效的方式(即最准确的结果 + 最少的时间)解决旅行商问题的二维欧几里得版本。在做我的研究时,我发现了很多算法,但Arora 1998 年的论文和它的介绍让我觉得可能是最好的算法。还有其他版本的解决方案使用相同的想法,例如Schultes在 2004 年的那个。问题是实现它似乎非常困难(如果不是不可能的话),我发现没有任何人以可访问的方式这样做的记录尽管这篇论文发表已经快 20 年了。
是否有任何现有的实施或至少有一个指导方针?如果不是,那么什么是现有且可实现的算法来尽可能最好地替代它?
algorithm pseudocode traveling-salesman polynomial-approximations
我已经将四阶多项式曲线拟合到我的数据中,如下所示:
y<-c(-13,16,35,40,28,36,43,33,40,33,22,-5,-27,-31,-29,-25,-26,-31,-26,-24,-25,-29,-23,4)
x<-1:24
#4th order polynomial fit
fit<-lm(y~poly(x,4,raw=TRUE))
plot(x,y,ylim=c(min(y)-10,max(y)+10))
lines(x,predict(fit,data.frame(x=x)),col="red")
abline(h=0,lty=2)
Run Code Online (Sandbox Code Playgroud)
我的最终目标是计算这条曲线与零线相交的 3 个点。
所以首先,我需要延长曲线拟合的末端,使其第三次超过零线。完成此操作后,我想计算该方程通过零线的 3 个点。
r curve-fitting polynomial-math polynomials polynomial-approximations