如何在Matlab符号工具箱中指定获取正平方根?
解决MATLAB符号工具箱中指定正平方根的问题
问题场景
你在使用MATLAB符号工具箱时遇到了这个问题:
syms c; assume(c,'real'); assumeAlso(c > 0); syms d; assume(d,'real'); assumeAlso(d > 0); N = (d^2 + 8*c)^0.5 - d isAlways(N > 0)
虽然直觉上因为d²+8c > d²,N应该恒大于0,但MATLAB返回的结果不符合预期——这是因为符号运算中,平方根默认包含正负两个分支(比如100的平方根是±10),导致表达式存在不确定性。
通用解决方案
对于已知为正的符号表达式a,要获取其正平方根,可以采用以下两种可靠方式:
- 直接使用
abs(sqrt(a)):利用绝对值强制保留平方根的非负分支,明确指定取正根。 - 先给表达式添加正性假设再调用
sqrt:通过assume(a > 0)约束表达式的范围,此时sqrt(a)会默认取主分支(正根)。
修改后的示例代码
syms c d assume(c > 0 & d > 0) % 方式1:用abs(sqrt(...))明确取正根 N1 = abs(sqrt(d^2 + 8*c)) - d isAlways(N1 > 0) % 返回逻辑值true % 方式2:对目标表达式添加正假设后调用sqrt a = d^2 + 8*c; assume(a > 0) N2 = sqrt(a) - d isAlways(N2 > 0) % 返回逻辑值true
原理说明
当明确指定取正平方根后,d²+8c的正平方根必然大于d(因为正数的正平方根随底数增大而单调递增,且d²+8c > d²),因此N恒大于0,isAlways会正确返回true。
内容的提问来源于stack exchange,提问作者BKay
相关产品推荐
相关产品推荐

