问题:已知一个n 项等比数列{ak}(n≥3,ai=0,q=0,q=1) 满足极差等于中位数,已知n,如何求出公比q 的值?
1. 分析
I. 先排除一种特殊情况:如果q=−1,数列的项为a1,−a1,a1,−a1,⋯,极差为2∣a1∣,中位数要么为0,要么为a1 或−a1,都不可能等于极差,因此q=−1。
II. 如果a1>0,
II-A. 如果q>1,数列递增,极差为an−a1=a1(qn−1−1)。
II-A.1. 如果n=2m+1 是奇数,极差为a1(q2m−1),中位数为am+1=a1qm,联立得q2m−qm−1=0,即qm=21+5=φ,即q=φ1/m。
II-A.2. 如果n=2m 是偶数,极差为a1(q2m−1−1),中位数为2am+am+1=2a1qm−1+a1qm=a1qm−12q+1,联立得q2m−1−qm−12q+1−1=0。
令qm=t,则qt2−qt⋅2q+1−1=0,同时乘以2q,得到2t2−2q=t(q+1),整理成关于q 的方程,得到q=2+t2t2−t,其中t=qm>1。
II-B. 如果0<q<1,数列递减,极差为a1−an=a1(1−qn−1)。
II-B.1. 如果n=2m+1 是奇数,极差为a1(1−q2m),中位数为am+1=a1qm,联立得q2m+qm−1=0,即qm=2−1+5=φ−1,即q=φ−1/m。
II-B.2. 如果n=2m 是偶数,极差为a1(1−q2m−1),中位数为2am+am+1=2a1qm−1+a1qm=a1qm−12q+1,联立得q2m−1+qm−12q+1−1=0。
II-C. 如果q<−1,数列项的符号交替。
II-C.1. 如果n=2m+1 是奇数,有a2m<a2m−2<⋯<0<a1<a3<⋯<a2m+1。
最大值是a2m+1=a1q2m,最小值是a2m=a1q2m−1,极差为a2m+1−a2m=a1(q2m−q2m−1);有m+1 个正项,m 个负项,中位数(第m+1 大的数)是最小的正项即a1;联立得q2m−q2m−1−1=0。
II-C.2. 如果n=2m 是偶数,有a2m<a2m−2<⋯<0<a1<a3<⋯<a2m−1。
最大值是a2m−1=a1q2m−2,最小值是a2m=a1q2m−1,极差为a2m−1−a2m=a1(q2m−2−q2m−1);有m 个正项,m 个负项,中位数是最大的负项与最小的正项的平均值,即2a2+a1=2a1q+a1=a12q+1;联立得q2m−2−q2m−1−2q+1=0。
II-D. 如果−1<q<0,数列项的符号交替。
II-D.1. 如果n=2m+1 是奇数,有a2<a4<⋯<a2m<0<a2m+1<a2m−1<⋯<a1。
最大值是a1,最小值是a2=a1q,极差为a1−a2=a1(1−q);有m+1 个正项,m 个负项,中位数(第m+1 大的数)是最小的正项即a2m+1=a1q2m;联立得q2m+q−1=0。
II-D.2. 如果n=2m 是偶数,有a2<a4<⋯<a2m<0<a2m−1<a2m−3<⋯<a1。
极差仍然为a1−a2=a1(1−q);有m 个正项,m 个负项,中位数是最大的负项与最小的正项的平均值,即2a2m+a2m−1=2a1q2m−1+a1q2m−2=a1q2m−22q+1;联立得q2m−22q+1+q−1=0。
III. 如果a1<0,只需要将大部分结论对称即可。
III-A. 如果q>1,数列递减,极差为a1−an=a1(1−qn−1)。
III-A.1. 如果n=2m+1 是奇数,同 II-B.1,得到q2m+qm−1=0。
III-A.2. 如果n=2m 是偶数,同 II-B.2,得到q2m−1+qm−12q+1−1=0。
III-B. 如果0<q<1,数列递增,极差为an−a1=a1(qn−1−1)。
III-B.1. 如果n=2m+1 是奇数,同 II-A.1,得到q2m−qm−1=0。
III-B.2. 如果n=2m 是偶数,同 II-A.2,得到q2m−1−qm−12q+1−1=0。
III-C. 如果q<−1,数列项的符号交替。
III-C.1. 如果n=2m+1 是奇数,有a2m+1<a2m−1<⋯<a1<0<a2<a4<⋯<a2m。
最大值是a2m=a1q2m−1,最小值是a2m+1=a1q2m,极差为a2m−a2m+1=a1(q2m−1−q2m);有m 个正项,m+1 个负项,中位数(第m+1 大的数)是最大的负项即a1;联立得q2m−1−q2m−1=0。
III-C.2. 如果n=2m 是偶数,有a2m−1<a2m−3<⋯<a1<0<a2<a4<⋯<a2m。
最大值是a2m=a1q2m−1,最小值是a2m−1=a1q2m−2,极差为a2m−a2m−1=a1(q2m−1−q2m−2);有m 个正项,m 个负项,中位数是最大的负项与最小的正项的平均值,即2a1+a2=2a1+a1q=a12q+1;联立得q2m−1−q2m−2−2q+1=0。
III-D. 如果−1<q<0,数列项的符号交替。
III-D.1. 如果n=2m+1 是奇数,有a1<a3<⋯<a2m+1<0<a2m<a2m−2<⋯<a2。
最大值是a2=a1q,最小值是a1,极差为a2−a1=a1(q−1);有m 个正项,m+1 个负项,中位数(第m+1 大的数)是最大的负项即a2m+1=a1q2m;联立得q2m−q+1=0。
III-D.2. 如果n=2m 是偶数,有a1<a3<⋯<a2m−1<0<a2m<a2m−2<⋯<a2。
最大值是a2=a1q,最小值是a1,极差为a2−a1=a1(q−1);有m 个正项,m 个负项,中位数是最大的负项与最小的正项的平均值,即2a2m−1+a2m=2a1q2m−2+a1q2m−1=a1q2m−22q+1;联立得q2m−22q+1−q+1=0。
2. 数值解
我们可以写代码获得这些方程的数值解:
II-A.1.q2m−qm−1=0 在q>1;III-B.1. 在0<q<1。
II-A.2.q2m−1−qm−12q+1−1=0 在q>1;III-B.2. 在0<q<1。
II-B.1.q2m+qm−1=0 在0<q<1;III-A.1. 在q>1。
II-B.2.q2m−1+qm−12q+1−1=0 在0<q<1;III-A.2. 在q>1。
II-C.1.q2m−q2m−1−1=0 在q<−1。
II-C.2.q2m−2−q2m−1−2q+1=0 在q<−1。
II-D.1.q2m+q−1=0 在−1<q<0。
II-D.2.q2m−22q+1+q−1=0 在−1<q<0。
III-C.1.q2m−1−q2m−1=0 在q<−1。
III-C.2.q2m−1−q2m−2−2q+1=0 在q<−1。
III-D.1.q2m−q+1=0 在−1<q<0。
III-D.2.q2m−22q+1−q+1=0 在−1<q<0。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
| import sympy as sp import numpy as np from scipy.optimize import fsolve, root_scalar, brentq import warnings
warnings.filterwarnings("ignore", category=RuntimeWarning)
def get_func_and_m(n): if n % 2 == 0: return 1, n // 2 else: return 0, (n - 1) // 2
def solver_numeric(n): func_code, m = get_func_and_m(n) q = sp.symbols('q') if func_code == 0: eqs_raw = { '2A': q**(2*m) - q**m - 1, '2B': q**(2*m) + q**m - 1, '2C': q**(2*m) - q**(2*m-1) - 1, '2D': q**(2*m) + q - 1, '3A': q**(2*m) + q**m - 1, '3B': q**(2*m) - q**m - 1, '3C': q**(2*m-1) - q**(2*m) - 1, '3D': q**(2*m) - q + 1, } else: eqs_raw = { '2A': q**(2*m-1) - q**(m-1) * (q + 1) / 2 - 1, '2B': q**(2*m-1) + q**(m-1) * (q + 1) / 2 - 1, '2C': q**(2*m-2) - q**(2*m-1) - (q + 1) / 2, '2D': q**(2*m-2) * (q + 1) / 2 + q - 1, '3A': q**(2*m-1) + q**(m-1) * (q + 1) / 2 - 1, '3B': q**(2*m-1) - q**(m-1) * (q + 1) / 2 - 1, '3C': q**(2*m-1) - q**(2*m-2) - (q + 1) / 2, '3D': q**(2*m-2) * (q + 1) / 2 - q + 1, } ranges = { '2A': (1.0, float('inf')), '2B': (0.0, 1.0), '2C': (float('-inf'), -1.0), '2D': (-1.0, 0.0), '3A': (1.0, float('inf')), '3B': (0.0, 1.0), '3C': (float('-inf'), -1.0), '3D': (-1.0, 0.0), } results = {} for name, eq in eqs_raw.items(): f = sp.lambdify(q, eq, 'numpy') a, b = ranges[name] try: if np.isinf(a): a_eff = -100.0 if f(a_eff) * f(-1.001) > 0: a_eff *= 10 while f(a_eff) * f(-1.001) > 0 and a_eff > -1e6: a_eff *= 10 sol = brentq(f, a_eff, -1 - 1e-6) elif np.isinf(b): b_eff = 100.0 if f(1.001) * f(b_eff) > 0: b_eff *= 10 while f(1.001) * f(b_eff) > 0 and b_eff < 1e6: b_eff *= 10 sol = brentq(f, 1 + 1e-6, b_eff) else: sol = brentq(f, a + 1e-6, b - 1e-6) results[name] = float(sol) except Exception as e: try: initial_guess = (a + b) / 2 if not np.isinf(b) and not np.isinf(a) else ( -2.0 if a == float('-inf') else 2.0) if np.isinf(initial_guess) or np.isnan(initial_guess): initial_guess = 2.0 if b > 0 else -2.0 sol = fsolve(f, initial_guess)[0] if ranges[name][0] < sol < ranges[name][1]: results[name] = float(sol) else: results[name] = None except: results[name] = None return results
def fmt(value): if value is None: return "" else: return f"{value:.4f}"
def main(): print("| n | 2A | 2B | 2C | 2D | 3A | 3B | 3C | 3D |") print("|---|---|---|---|---|---|---|---|---|") print("| $a_1$ | + | + | + | + | - | - | - | - |") print("| $q$ | $(1, +\infty)$ | $(0, 1)$ | $(-\infty, -1)$ | $(-1, 0)$ | $(1, +\infty)$ | $(0, 1)$ | $(-\infty, -1)$ | $(-1, 0)$ |") for n in (3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 20, 50, 100): results = solver_numeric(n) print(f"| {n} | {fmt(results.get('2A'))} | {fmt(results.get('2B'))} | {fmt(results.get('2C'))} | {fmt(results.get('2D'))} | {fmt(results.get('3A'))} | {fmt(results.get('3B'))} | {fmt(results.get('3C'))} | {fmt(results.get('3D'))} |")
if __name__ == "__main__": main()
|
结果如下:
| n | 2A | 2B | 2C | 2D | 3A | 3B | 3C | 3D |
|---|
| a1 | + | + | + | + | - | - | - | - |
| q | (1,+∞) | (0,1) | (−∞,−1) | (−1,0) | (1,+∞) | (0,1) | (−∞,−1) | (−1,0) |
| 3 | 1.6180 | 0.6180 | | | | | | |
| 4 | 1.3837 | 0.7227 | | | | | | |
| 5 | 1.2720 | 0.7862 | | | | | | |
| 6 | 1.2133 | 0.8242 | | | | 0.0021 | | |
| 7 | 1.1740 | 0.8518 | | | | | | |
| 8 | 1.1477 | 0.8713 | | | | | | |
| 9 | 1.1278 | 0.8867 | | | | | | |
| 10 | 1.1130 | 0.8985 | | | | | | |
| 11 | 1.1010 | 0.9082 | | | | 0.4982 | | |
| 12 | 1.0915 | 0.9162 | | | | 0.4999 | | |
| 13 | 1.0835 | 0.9229 | | | | 0.5000 | | |
| 14 | 1.0769 | 0.9286 | | | | 0.5000 | | |
| 15 | 1.0712 | 0.9336 | | | | 0.5000 | | |
| 20 | 1.0520 | 0.9506 | | | | 0.5000 | | |
| 50 | 1.0198 | 0.9805 | | | | 0.5000 | | |
| 100 | 1.0098 | 0.9903 | | | | 0.5000 | | |
3. 检验
将m 看作自变量,q 看作m 的函数,分析上述隐函数的零点存在性和单调性,即可证明解在对应区间中的存在性与唯一性。
考虑 II-A 和 II-B 的方程:
q2m−qm−1=0 的解是q=φ1/m,q2m+qm−1=0 的解是q=φ−1/m,根据幂函数的性质,当m 增大时,φ1/m 单调递减趋近于1,φ−1/m 单调递增趋近于1,因此在对应区间内单调。
q2m−1−qm−12q+1−1=0:
先整理q2m−1−21qm−21qm−1−1=0,求导(2m−1)q2m−2−21mqm−1−21(m−1)qm−2,令导数为0,得到qm−2((2m−1)qm−21mq−21(m−1))=0,由于q>0,因此qm−2>0,所以(2m−1)qm−21mq−21(m−1)=0。
4. 结论
总结一下,我们得到已知数列项数n,满足极差等于中位数的等比数列的公比q 的取值范围和方程:
如果只知道n,能构造出 2 或 3 个满足条件的q 值,分别对应上述三种情况。