- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试计算以 Python 中的 a=1 为中心的自然对数 ln(x) 的泰勒多项式。我正在使用维基百科上给出的系列,但是当我尝试像 ln(2.7) 这样的简单计算而不是给我接近 1 的值时,它给了我一个巨大的数字。有什么明显的地方我做错了吗?
def log(x):
n=1000
s=0
for i in range(1,n):
s += ((-1)**(i+1))*((x-1)**i)/i
return s
使用泰勒级数:
编辑:如果有人偶然发现了这个计算某个实数的自然对数的另一种方法是使用数值积分(例如黎曼和、中点法则、梯形法则、辛普森法则等)来计算经常使用的积分定义自然对数;
最佳答案
该系列仅在 x <= 1 时有效。对于 x>1,您将需要一个不同的系列。
例如这个(找到 here ):
def ln(x): return 2*sum(((x-1)/(x+1))**i/i for i in range(1,100,2))
输出:
ln(2.7) # 0.9932517730102833
math.log(2.7) # 0.9932517730102834
请注意,随着 x 变大(直至变得不切实际),收敛需要超过 100 个项
您可以通过添加 x 的较小因子的对数来补偿:
def ln(x):
if x > 2: return ln(x/2) + ln(2) # ln(x) = ln(x/2 * 2) = ln(x/2) + ln(2)
return 2*sum(((x-1)/(x+1))**i/i for i in range(1,1000,2))
您也可以在基于 Taylor 的函数中执行此操作以支持 x>1:
def log(x):
if x > 1: return log(x/2) - log(0.5) # ln(2) = -ln(1/2)
n=1000
s=0
for i in range(1,n):
s += ((-1)**(i+1))*((x-1)**i)/i
return s
当 x 接近零时,这些级数也需要更多的项来收敛,因此您可能希望在另一个方向上处理它们,以保持要计算的实际值在 0.5 和 1 之间:
def log(x):
if x > 1: return log(x/2) - log(0.5) # ln(x/2 * 2) = ln(x/2) + ln(2)
if x < 0.5: return log(2*x) + log(0.5) # ln(x*2 / 2) = ln(x*2) - ln(2)
...
如果性能是个问题,您需要将 ln(2) 或 log(0.5) 存储在某处并重用它,而不是在每次调用时都计算它
例如:
ln2 = None
def ln(x):
if x <= 2:
return 2*sum(((x-1)/(x+1))**i/i for i in range(1,10000,2))
global ln2
if ln2 is None: ln2 = ln(2)
n2 = 0
while x>2: x,n2 = x/2,n2+1
return ln2*n2 + ln(x)
关于python - log(x) 的泰勒级数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66487579/
我需要对反正切值执行泰勒级数 50 次。表示 arctan Taylor 级数的域之间的 50 个数字,即 [-1,1]。我已经用手动用户输入对其进行了测试并且它工作正常,但是我在代码中递增 0.01
我在网上看了几个小时,想看看我是否能找到解决方案,虽然我已经找到了很多解决方案,但我教授的指示如下: Write a program to estimate PI (π) using the foll
我最近在编程测试中被问到这个问题。我似乎无法理解为什么我会得到答案“1”。我是 C 编程语言的初学者。 这是我的代码: #include int main() { float c = 0;
我是一名优秀的程序员,十分优秀!