Sympy无法求解含根式的不等式,该如何解决?
问题背景
需要求解的不等式为:$|(n^3 + n2){1/3} - (n^3 - n2){1/3} - \frac{2}{3}| < 0.01$,对应的Sympy初始代码如下:
import sympy as sp from sympy.abc import n epsilon = 0.01 a = 2/3 xn = (n**3 + n**2)**(1/3) - (n**3 - n**2)**(1/3)
无效尝试及报错
- 使用
solve_univariate_inequality
ans = sp.solve_univariate_inequality(sp.Abs(xn-a) < epsilon, n, relational=False)
报错:
NotImplementedError: The inequality, Abs((x3 -x2)0.333333333333333 - (x3 + x**2)**0.333333333333333 + 2/3) <0.01, cannot be solved using solve_univariate_inequality.
- 使用
solve_poly_inequality
ans = sp.solve_poly_inequality(sp.Poly(xn-2/3-0.01, n, domain='ZZ'), '==')
报错:
sympy.polys.polyerrors.PolynomialError: (n3 +n2)**0.333333333333333 contains an element of the set of generators.
- 使用
solveset
ans = sp.solveset(sp.Abs(xn-2/3) < 0.01, n)
返回结果:
ConditionSet(n, Abs((n3 - n2)0.333333333333333 - (n3 +n**2)**0.333333333333333 + 0.666666666666667) < 0.01, Complexes)
正确解决思路
由于原表达式含三次根式,直接符号求解难度大,可通过代数化简+数值/近似分析解决:
步骤1:代数化简表达式
利用立方差公式$a^3 - b^3 = (a - b)(a^2 + ab + b2)$,令$a=(n3+n2){1/3}$,$b=(n3-n2)^{1/3}$,则$a-b=x_n$。计算得:
$$a^3 - b^3 = 2n^2$$
代入立方差公式变形得:
$$x_n = \frac{2n2}{a2 + ab + b^2}$$
提取分母的公因子$n^2$,化简后得到:
$$x_n = \frac{2}{(1 + 1/n)^{2/3} + (1 - 1/n2){1/3} + (1 - 1/n)^{2/3}}$$
步骤2:泰勒展开近似(针对大n)
当$n$足够大时,$1/n$趋近于0,对分母各项做泰勒展开到$1/n^2$阶,合并后可得:
$$x_n \approx \frac{2}{3} + \frac{10}{81n^2}$$
步骤3:转化不等式求解
原不等式$|x_n - 2/3| < 0.01$可近似为:
$$\frac{10}{81n^2} < 0.01$$
解此不等式得:
$$n > \sqrt{\frac{1000}{81}} \approx 3.51$$
步骤4:精确数值求解
用Sympy的nsolve工具求解等式$|x_n - 2/3| = 0.01$的正根,确定不等式解集:
import sympy as sp from sympy.abc import n # 用精确有理数避免浮点数误差 epsilon = sp.Rational(1, 100) a = sp.Rational(2, 3) xn = (n**3 + n**2)**sp.Rational(1, 3) - (n**3 - n**2)**sp.Rational(1, 3) # 定义等式并求解正根 eq = sp.Abs(xn - a) - epsilon root = sp.nsolve(eq, n, 4) print(f"当n > {root.evalf()}时,不等式成立")
运行结果显示临界根约为3.47,因此当$n \geq 4$(n为正整数)时,不等式成立。
内容的提问来源于stack exchange,提问作者BURAKKU

