用 Matlab 的 solve 解方程要得到解析解,為什麼只返回了一個數值解?
這個方程初步可以寫成
,目測至少超過了5次,理論上是不能一般地用根式表達出來的,機器更做不到這一點了。solve函式只在3次以下可以有解析解。不過要求數值解的話可以用fsolve函式,這個函式可以先賦初值來得到最優解,比如初值賦為-2的解是這樣的
x = fsolve(@(x) sqrt(1/x+1)+sqrt(1/(x-1))-sqrt(1/(x^2-2))-sqrt(x^2-1),[-2],optimoptions(‘fsolve’))
x =
-2087/2140 - 3379/2851i
一般情況下不論賦多大的初值,算出始終是同樣的解。不過這個方程有若干個間斷點,賦某個初值可能只能夠求到一段上的解,因為當計算機執行到斷點上時會自動停止運算。所以要找出其間斷點,然後分開來求。
在這個式子上可以看到其斷點分別是在
時。所以只需在小於
,
到
,大於
,
到
這幾個範圍內各取幾個有理數作為初值來算就行了。另外
到
之間解可能比較密集,函式對初值比較敏感,所以要多取幾次,最好寫一個迴圈。
用Mathematica做的,偷懶直接一圖流了,不喜勿怪
===================更新======================
@曹洪洋指出用Reduce或者Solve加Method->Reduce能很快算出所有的解析解,效果如下
用時不足一秒,果然不知高到哪裡去了
用Mathematica
用matlab求解的話,可以定義不同的初始值進行嘗試,比如-1,1,i,-i等
數值求解就這樣
應該是間斷點太多了
然後次數較高無法得到根式解
警告:無法象徵性地解決。
使用vpasolve返回數值解。
>在sym/solve中(第304行)
機翻的
Warning: Unable to solve symbolically。
Returning a numeric solution using vpasolve。
> In sym/solve (line 304)
現在也可以解了,而且速度還可以。