mathematica是否可以把複雜代數方程(帶根號)轉化成多項式方程?
mathematica可以求出符號解,但是結果太複雜
原方程是個含幾個二次根號的代數方程,按道理經過有限次平方就可以轉成普通高次方程,儘管這個高次方程的解很多會是增根有沒有方法讓mathematica直接輸出這個多項式方程表達式?方程的形式是1 + x + d1 x + a1 x^2 + e1 (e2 + d2 x + Sqrt[c2 + x (b2 + a2 x)]) + b1 x (e2 + d2 x + Sqrt[c2 + x (b2 + a2 x)]) + c1 (e2 + d2 x + Sqrt[c2 + x (b2 + a2 x)])^2 = 0
發現內置函數:GroebnerBasis
The set of polynomials in a Gr?bner basis have the same collection of roots as the original polynomials.
完全滿足你的要求。
對於這種需求的使用方法:GroebnerBasis[expr,var][[1]]
例如:
GroebnerBasis[
1 + x + d1 x + a1 x^2 + e1 (e2 + d2 x + Sqrt[c2 + x (b2 + a2 x)]) +
b1 x (e2 + d2 x + Sqrt[c2 + x (b2 + a2 x)]) +
c1 (e2 + d2 x + Sqrt[c2 + x (b2 + a2 x)])^2 == 0,
x][[1]]~Collect~x
和我昨天寫的程序對比圖如下,得到的結果是一樣的:
--------------------------------------------寫了一段代碼
ExpandEquationWithSqrt[expr_, var_] :=
Module[{process, sqrts, iter, expr2}, expr2 = Expand[expr];
process = {ReleaseHold[Delete[Hold[Evaluate@expr2], {1, 0}]]};
sqrts = DeleteDuplicates@
Select[Flatten@(If[
ToString[#[[0]]] ==
"Times", {ReleaseHold[
Delete[Hold[Evaluate@#], {1, 0}]]}, #] /@
process), #[[0]] == Power #[[2]] == 1/2 ];
sqrts = Select[sqrts,
MemberQ[DeleteDuplicates@Cases[#, _Symbol, Infinity], var] ];
iter[1] = expr2;
If[Length[sqrts] &>= 1,
Do[iter[i] = Collect[iter[i], sqrts[[i]]];
iter[i +
1] = (iter[i] -
PolynomialMod[iter[i], sqrts[[i]]])^2 - (PolynomialMod[
iter[i], sqrts[[i]]])^2, {i, Length[sqrts]}];
ExpandEquationWithSqrt[iter[Length[sqrts] + 1], var],
Collect[Expand@expr2, var]]]
推薦閱讀:
※如何評價這道根式運算數學題?
※請問在德國讀數學本科難度大么,老師的要求高么,和美國好的大學比呢?
※點乘和叉乘的區別是什麼?
※數學好的文科生是一種怎樣的體驗?
※想深入學習計算力學(固體力學、結構工程、土力學等);從數學開始著手,還是從力學著手好?(本人土木出身)
TAG:數學 | WolframMathematica |