0235 等差比数列
* * * *
拉格朗日计划
* * * *
等差比数列

给定等差比数列$u_k=(900-3k)r^{k-1}$及其部分和$s_n=\sum_{k=1}^{n}u_k$。

求使得$s_{5000}=-6\times 10^{11}$的r值,答案四舍五入至小数点后12位。

本题难度:



解答

容易计算 $$s_n=900\cdot\frac{1-r^n}{1-r}-3(\frac{1-r^{n+1}}{1-r})'=900\cdot\frac{1-r^n}{1-r}-3\cdot\frac{-(n+1)r^n(1-r)+(1-r^{n+1})}{(1-r)^2},$$ 化简得 $$900(1-r^n)(1-r)+3(n+1)r^n(1-r)-3(1-r^{n+1})-s_n(1-r)^2=0.$$ 即 $$900(1-r^n)+3(n+1)r^n-3(1+r+\ldots+r^n)-s_n(1-r)=0.$$ 代入$n=5000$和$s_n=-6\times 10^{11}$得 $$14100r^{5000}-3(r^{4999}+\ldots+r^2)-600000000003r+600000000897=0.$$ 将上面的等式左侧记作$f(r)$。

geogebra的图像计算器可以画出f的图像,并将根计算到小数点后10位,即$1.0023221086$。

接下来以此为初值,用牛顿法 $$x_{k+1}=x_k-\frac{f(x)}{f'(x)},$$ 迭代计算,当相邻两次迭代之间的差异小于$10^{-13}$时停止。

由于$f$的次数较高,此处用秦九韶法计算多项式的值,即 $$a_nx^n+\ldots+a_0=(\ldots((a_nx+a_{n-1})x+a_{n-2})x+\ldots+a_1)x+a_0.$$ 等式右侧的计算量是线性的,可以用一个栈处理。

注:本题中涉及的秦九韶法、牛顿法一般在《数值分析》等课程中讲授。第一个公式(即$s_n$的公式)中的导数部分是我国《高等数学》课程的标准内容。

import decimal

decimal.getcontext().prec=15

def p(a,x):
    b=a[:]
    while len(b)>1:
        u,v=b.pop(),b.pop()
        b.append(u*x+v)
    return b[0]

f=[600000000897,-600000000003]+[-3]*4998+[14100]
df=[-600000000003]+[-3*i for i in range(2,5000)]+[14100*5000]

epsilon=decimal.Decimal(0.0000000000001)


x0=decimal.Decimal(1.0023221086)
x1=x0-p(f,x0)/p(df,x0)

while abs(x1-x0)>=epsilon:
    x0=x1
    x1=x0-p(f,x0)/p(df,x0)

decimal.getcontext().prec=13

print decimal.Decimal(1.0)*x1