Mathematica三次正根求解代码逻辑及abs、arg变量作用咨询
代码功能说明
你提供的PositiveCubicRoot[p_, q_, r_]是用来求解首一三次多项式(x^3 + px^2 + qx + r = 0)正实根的工具函数,基于卡尔达诺三次方程求根公式实现,同时兼容判别式为负的不可约情形,通过三角解法规避了复数运算。
完整运行逻辑流程
- 第一步:定义消参变量
po3 = p/3,对应三次方程消去二次项的替换参数,会通过(x = t - p/3)的变量替换,把原三次方程转换为不含二次项的简约三次方程 - 第二步:计算简约三次方程的两个核心系数
a、b - 第三步:计算三次方程判别式
det = a^3 + b^2,判别式的符号直接决定三次方程的实根数量:det≥0时仅存在1个实根,det<0时存在3个不同实根 - 第四步:根据判别式结果分支计算实根:
- 若
det ≥ 0:直接使用卡尔达诺代数公式计算唯一实根,计算完成后直接返回根值 - 若
det < 0:属于三次方程的不可约情形,直接使用代数公式会出现复数开方运算,因此切换为三角解法计算实根,最终返回计算得到的正实根
- 若
变量abs、arg的作用
这两个变量仅在det<0的三角解法分支中使用:
abs为三角解法的模长参数,会经过三次更新:- 第一次赋值
abs = Sqrt[-a^3],是三角形式下的初始模长 - 第二次赋值
abs = Power[abs, 1/3],对模长做三次开方处理 - 第三次赋值
abs = (abs - a/abs),得到后续余弦项的系数
- 第一次赋值
arg为三角解法的幅角参数,最后会被复用为最终根结果:- 第一次赋值
arg = ArcCos[-b/abs],计算三角形式下的初始幅角,取值范围固定在[0, π],保证后续计算得到的是正实根 - 第二次赋值
arg = -po3 + abs*Cos[arg/3],这一步已经完成最终实根的计算,直接把变量名复用为返回的根值
- 第一次赋值
内容的提问来源于stack exchange,提问作者Mogine Showey
相关产品推荐
相关产品推荐

