Я никогда не любил с помощью решателей «вслепую», то есть, без какого-то приличной исходной схемы выбора значения. По моему опыту, значение, которые вы найдете, когда делая вещи вслепую, также будет без контекста. Смысл, вы часто пропускаете решения, считаете, что что-то является решением, в то время как на самом деле решатель взорвался и т. д.
Для этого конкретного случая важно понимать, что fzero
использует числовые производные, чтобы находить все более качественные аппроксимации. Но производные для f(x) = x · tan(x) - 1
все труднее точно вычислить для увеличения x
:
Как вы можете видеть, тем больше x
, тем лучше f(x)
приближается к вертикальной линии; fzero
просто взорвется! Поэтому необходимо получить оценку как близко к решению, насколько возможно, даже после ввода fzero
.
Итак, вот способ получить good начальные значения.
Рассмотрит функцию
f(x) = x · tan(x) - 1
Зная, что tan(x)
имеет Taylor expansion:
tan(x) ≈ x + (1/3)·x³ + (2/15)·x⁵ + (7/315)·x⁷ + ...
мы можем использовать, чтобы аппроксимировать функцию f(x)
. Усечение после второго срока, мы можем написать:
f(x) ≈ x · (x + (1/3)·x³) - 1
Теперь ключ, чтобы понять, является то, что tan(x)
повторы с периодом π
. Поэтому наиболее целесообразно рассмотреть семейство функций:
fₙ(x) ≈ x · ((x - n·π) + (1/3)·(x - n·π)³) - 1
Оценивая это в течение нескольких кратных и собирающих терминов дает следующее обобщение:
f₀(x) = x⁴/3 - 0π·x³ + (0π² + 1)x² - (0π + (0π³)/3)·x - 1
f₁(x) = x⁴/3 - 1π·x³ + (1π² + 1)x² - (1π + (1π³)/3)·x - 1
f₂(x) = x⁴/3 - 2π·x³ + (4π² + 1)x² - (2π + (8π³)/3)·x - 1
f₃(x) = x⁴/3 - 3π·x³ + (9π² + 1)x² - (3π + (27π³)/3)·x - 1
f₄(x) = x⁴/3 - 4π·x³ + (16π² + 1)x² - (4π + (64π³)/3)·x - 1
⋮
fₙ(x) = x⁴/3 - nπ·x³ + (n²π² + 1)x² - (nπ + (n³π³)/3)·x - 1
Реализация все это в простом тесте MATLAB :
% Replace this with the whole number of pi's you want to
% use as offset
n = 5;
% The coefficients of the approximating polynomial for this offset
C = @(npi) [1/3
-npi
npi^2 + 1
-npi - npi^3/3
-1];
% Find the real, positive polynomial roots
R = roots(C(n*pi));
R = R(imag(R)==0);
R = R(R > 0);
% And use these as initial values for fzero()
x_npi = fzero(@(x) x.*tan(x) - 1, R)
В цикле, это может привести следующую таблицу:
% Estimate (polynomial) Solution (fzero)
0.889543617524132 0.860333589019380 0·π
3.425836967935954 3.425618459481728 1·π
6.437309348195653 6.437298179171947 2·π
9.529336042900365 9.529334405361963 3·π
12.645287627956868 12.645287223856643
15.771285009691695 15.771284874815882
18.902410011613000 18.902409956860023
22.036496753426441 22.036496727938566 ⋮
25.172446339768143 25.172446326646664
28.309642861751708 28.309642854452012
31.447714641852869 31.447714637546234
34.586424217960058 34.586424215288922 11·π
Как вы можете видеть, аппроксимация в основном равна решению. Соответствующий участок:
Что вы подразумеваете под «получить все значения»? Существуют бесконечные решения этого уравнения (просто [зарисуйте его и посмотрите] (http://www.wolframalpha.com/input/?i=tan (x) +% 3D% 3D + 1% 2Fx + от + -20 + до +20)). –
Извините, я имел в виду более одного значения. Например, в диапазоне. – user137425
Я имел в виду, численные решения в некотором диапазоне – user137425