Maple或Matlab怎麼解不定方程?

這類方程應該算是不定方程,在給定條件下只有一組解,

下面的Maple代碼怎麼運行不了呢?

或者能用其他相關軟體算出來也行,比如Matlab,R語言等

solve({a^2+b^2+169+sqrt(c-13)-24*a-10*b = 0},{a, b, c})
assuming a&>0, b&>0, c&>0;

solve([1/(cos(a)^2)+1/(sin(a)^2*sin(b)^2*cos(b)^2) = 9,
a&>0, a&0, b&


我不知道 maple 怎麼算,mathematica 是可以算的。

第一個問題:

Solve[{a^2 + b^2 + 169 + Sqrt[c - 13] - 24 a - 10 b == 0, a &>= 0,
b &>= 0, c &>= 0}, {a, b, c}]

能得出正確答案

第二個問題:

Solve[{1/(a b (1 - b)) + 1/(1 - a) == 9, a &>= 0, b &>= 0, a &<= 1, b &<= 1}, {a, b}]

也能得出正確答案(你應該能看出這個形式和原問題是什麼關係吧?)

既然你會手算,答案我就不貼了。另外……雖然題主說不是作業題,但是這種湊得很好的題目很難讓人相信不是作業題。


數學問題果斷使用Mathematica。第一個用FindInstance,第二個用Solve。


MATLAB 的 Symbolic Math Toolbox 可以通過 solve 用解析方法解代數方程,不過如果條件是不定的,可能不容易快速得到結果。也可以用 vpasolve (我用的R2013a) 來用數值方法解,但沒用過不知道不定條件下如何。其實 MATLAB 最強大的就是數值計算,這類簡單問題可以用數值逼近方法來解決。當然只是一種方法,也許不能得到解析結果,也許運氣不好遇到局部極值啥的,權作參考。

對於這兩題,都可以將變數限定在某個範圍內,設定一個精度,用數值模擬求得最小結果來解。

第二題相對簡單。

clear;
range = [0 : 0.001 : pi / 2];

for a = range
for b = range
index_a = find(a == range);
index_b = find(b == range);
c(index_a, index_b) = 1 / (cos(a) ^ 2) + ...
1 / (sin(a) ^ 2 * sin(b) ^ 2 * cos(b) ^ 2) - 9;
end
end

solution = abs(c);
[y, x] = find(solution == min(min(solution)));
solution_a = range(y);
solution_b = range(x);
solution_nv = c(y, x);
fprintf("a = %8.5f
b = %8.5f
nearest equation value = %8.5f
", ...
radtodeg(solution_a), radtodeg(solution_b), solution_nv);

得到結果:

a = 54.71747
b = 44.97719
nearest equation value = 0.00001

第二題涉及到三角形三邊關係,某一邊的條件,以及變數範圍的問題,姑且假設三邊均不超過200,在粗糙的精度下運氣好也能得到正確答案:

clear;
range_a = [1 : 1 : 200];
range_b = [1 : 1 : 200];
range_c = [13 : 1 : 200];

for a = range_a
for b = range_b
for c = range_c
index_a = find(a == range_a);
index_b = find(b == range_b);
index_c = find(c == range_c);
if index_a + index_b &> index_c || ...
index_a + index_c &> index_b || ...
index_b + index_c &> index_a
d(index_a, index_b, index_c) = a ^ 2 + b ^ 2 + 169 + ...
sqrt(c - 13) - 24 * a - 10 * b;
else
d(index_a, index_b, index_c) = 10000;
end
end
end
end

solution = abs(d);
[z, y, x] = find(solution == min(min(min(solution))));
solution_a = range_a(z);
solution_b = range_b(y);
solution_c = range_c(x);
solution_nv = d(z, y, x);
fprintf(["a = %8.5f
b = %8.5f
c = %8.5f
"...
"nearest equation value = %8.5f
"],...
solution_a, solution_b, solution_c, solution_nv);

得到結果:

a = 12
b = 5
c = 13
nearest equation value = 0

原來恰巧就是直角三角形。


對MATLAB來說第一題太難了點吧...

第二題倒是很方便:

f = @(x)1/(sin(x(1))^2*sin(x(2))^2*cos(x(2))^2)+1/(cos(x(1))^2)-9;
lsqnonlin(f,rand(1,2))

結果:

ans =

0.9541 0.7863



這種還是用Mathematica算比較好,matlab的長處不在這裡


推薦閱讀:

如何用R語言做結構方程模型?
怎樣學習matlab或R語言?
2018 年大家碼下的第一行代碼是什麼?
R語言中S3,S4,RC結構都分別是什麼?
用戶分析有哪些經典的模型和方法,如何系統的學慣用戶分析?

TAG:數學軟體 | Maple | MATLAB | WolframMathematica | R編程語言 |