2013-05-29 4 views
6

Предположим, у меня есть функция f = @(x) myfun(x);Можно ли получить несколько решений произвольного уравнения в Matlab?

Я могу использовать fzero, чтобы получить решение, самое близкое к заданному x0, но могу ли я получить все решения в определенной области, например: -5 < x < 5?

I.e. Можно ли получить решение, подобное результату roots, но для не-многочленов?

ответ

6

Да, вы можете.

Есть хороший submission on the file exchange, который позволяет вам делать именно это. Он работает, аппроксимируя вашу кривую полиномом Чебычева, а затем нахожу все вещественные корни этого многочлена.

Если вы хотите, вы можете использовать эти оценки для корней в качестве начальных значений для fzero, но часто (по крайней мере, для гладких и других хорошо выполненных кривых) требования к точности уже могут быть выполнены с использованием приближения Чебычева более высокого порядка ,

Для примера, используя только 18 значений функции (у меня есть немного измененная версия файла, но суть та же):

>> f = @(A) 17.7*sin(A).*cos(A)+87*sin(A).^2-9.65*cos(A)-47*sin(A); 
>> R = FindRealRoots(f, -5,5, 17) 
R = 
    -3.709993256346244 
    -3.345207732130925 
    -0.201929737187637 
    0.572382702285053 
    2.573423209113534 
    2.937157987217741 

>> R2 = R; 
>> funcCount = 0; 
>> for ii = 1:numel(R) 
     [R2(ii), ~,~, output] = fzero(f,R2(ii)); 
     funcCount = funcCount + output.funcCount; 
    end 
>> max(abs(R2(:)-R(:))) 
ans = 
    8.564253235401331e-004 
>> funcCount 
ans = 
    46 

например, есть только 8 частей на десять тысяч улучшения не менее 46 дополнительных оценок функций.

+0

@RobertP .: Ничего, что я знаю ... что несколько странно, так как [Чебышева многочлены не] (http://en.wikipedia.org/wiki/Chebyshev_polynomials) являются лучшим выбором для полиномиальных приближений. Действительно, по крайней мере, для типа функции, с которой вы имеете дело (гладкой, непрерывной и т. Д.), Можно ожидать, что точность будет довольно высокой. Единственный недостаток этого заключается в том, что может быть трудно выбрать «хорошие» значения 'n' (здесь очень удобно использовать встроенную функцию построения графика). –

+1

+1 для предложения полиномов Чебычева я нашел их очень полезными во многих аспектах вычислений. – bla

2

Сначала есть Matlab встроенный в вариант, который использует символическую математику набор инструментов: mathworks.com/help/symbolic/mupad_ref/numeric-realroots.html

Другой вариант, если ваша функция хорошо ведет себя, просто чтобы кормить fsolve с правильными догадками, так что даже если он использует цикл, это эффективное вычисление. Например:

A=linspace(-5,5,1000); 
[email protected](A) 17.7.*sin(A).*cos(A)+87.*sin(A).^2-9.65*cos(A)-47*sin(A) 

idx = find(diff(sign(f(A)))); 
for n=1:numel(idx) 
    r(n)=fzero(f,A(idx(n))) 
end 

r= 
    -3.709541990613713 
    -3.345170894638306 
    -0.202018624930518 
    0.572128202319968 
    2.573643316565874 
    2.938014412541281 
+0

Спасибо @natan! Я не знал о 'numeric :: realroots'. Второе решение было хорошо! знак равно –