公式x*x+[x]=10用matlab怎麼編程求解?
這題有點意思,可以作為一道「逆向思維」的分析題,用到的知識也不多,初高中的一元二次方程足以應付,沒必要完全藉助編程。
簡單看下這個方程,無非就是在一元二次方程中疊加了「高斯取整函數」。但是直接去求解還是比較困難的,原因就是你沒辦法用一個顯式的數值形式來表示的小數部分,進而表示出.
但是你把關注點放在上就豁然開朗了,如果可以順利解出,最終要得到無非就是在上疊加一個在內的實數罷了。
我們令,顯然原有方程可以轉化為,若存在,那麼關於的該一元二次方程必定有根,回想一下初中數學的相關知識得到:
,顯然就有的整數部分.現在已經保證了關於的二次方程有根,但還需要進一步保證在內至少有一個根。事實上,在該區間至多也只可能有一個根,因為的取值顯然不可能在中,這樣對稱軸就一定在區間之外。所以就簡單證明了在上至多僅有一個根(拋物線在該區間單調)。
根據零點存在定理,函數在端點處必定異號,即有:
.這個多項式不等式很好解,相關的四個根分別是:syms x
solve((x^2+x-10)*(x^2+3*x-9)==0, x)
ans =
- (3*5^(1/2))/2 - 3/2
(3*5^(1/2))/2 - 3/2
- 41^(1/2)/2 - 1/2
41^(1/2)/2 - 1/2
函數形態如下(點擊放大):
x = linspace(-5, 4, 1000);
y = (x.^2+x-10).*(x.^2+3*x-9);
plot(x, y, "LineWidth", 1.5)
hold on
plot(x, zeros(size(x)), "--", "LineWidth", 1.0)
ylim([min(y)-5, max(y)+5])
xlabel("$x$", "Interpreter", "Latex", "FontSize", 12)
ylabel("$f(x)$", "Interpreter", "Latex", "FontSize", 12)
title("Polynomial function", "FontName", "Arial", "FontSize", 15)
lg = legend("$f(x)=(x^2+x-10)(x^2+3x-9)$", "$g(x) equiv 0$");
lg.set("interpreter", "latex")
grid on
new_x = x(y&<0); new_y = y(y&<0); patch([new_x fliplr(new_x)], [new_y zeros(size(new_y))], "red") alpha(0.5)
所以可能的取值被限定在了,分別代入方程可以解出對應的,最終得到.難道我沒理解題主的意思……?直接算不行么
&>&> f = @(x)x.^2+round(x)-10;
ans = fzero(f,0)
ans =
2.6458
看你想要那個取整函數,可以用floor或者ceil取代round
當然這不能保證找到所有的解,畢竟依賴於初值。
P.S. 由於取整函數的存在,做數值解可能會發生一些奇怪的事情。比如我們把右邊的10換成8.5,再解一次
&>&> f = @(x)x.^2+round(x)-8.5;
ans = fzero(f,0)
ans =
2.5000
推薦閱讀: