Как построить функцию, используя код, который я написал с отправной точкой?

Я написал код алгоритма secant, и теперь у меня есть функция:

f(x) = 2x^3 - 4x^2 + 3x , с двумя начальными точками : x0 = -1 , x1 = 2 .

Мой вопрос в том, как я могу построить функцию, которую я написал, т.е. secant , с функцией выше , f и результатами ниже , на одном графике ?

Возможно ли это сделать?

Результаты, которые я получил после использования алгоритма secant:

    v =
   -4.0000
    2.2069
    2.3699
    2.6617
    2.5683
    2.5804

Это 6 итераций, которые я использовал в своем алгоритме secant для данного x0 & x1 выше.

Я был бы признателен, если бы вы могли объяснить.

ИЗМЕНИТЬ:

Это код, который я использовал для получения результатов:

[z,n,v]=secant([-1,2],10^(-5),10^(-5),10)

для прототипа:

function [x,n,v]=secant(X,d,e,N)

% x0 is the first point
% x1 is the end point 
% d is the tolerance 
% e is the requested precision 
% N is the number of iterations 

Спасибо .


person JAN    schedule 03.05.2012    source источник


Ответы (2)


Я быстро собрал это вместе, оно иллюстрирует мощную анонимную функцию < em>и показано, как построить результаты функции секущей (так же, как в википедии: http://en.wikipedia.org/wiki/File:Secant_method.svg)

Однако я не понимаю, почему ваша секущая функция имеет как допуск, так и запрошенную точность в качестве входных данных; Я бы подумал, что допуск является результатом алгоритма секущих.

function [  ] = tmp1(  )

    f=@(x) x.^2;
    [xend,n,v]=secant(f,-4,3,1e-4,50);
    fprintf('after %d iterations reached final x_end = %g, f(x_end) = %g\n',n,xend,f(xend))


    figure;hold on;
    xtmp = linspace(min(v),max(v),250);
    plot(xtmp,f(xtmp),'r'); % plot the function itself
    line([v(1:end-2) v(3:end)]',[f(v(1:end-2)) zeros(n+1,1)]','Color','b','Marker','.','MarkerEdgeColor','b'); % plot the secant lines
    plot(v,f(v),'.','MarkerEdgeColor','r')% plot the intermediate points of the secant algorithm
    line([v(3:end) v(3:end)]',[zeros(n+1,1) f(v(3:end))]','Color','k','LineStyle','--'); % vertical lines

    ylim([-4 max(f(xtmp))]); % set y axis limits for nice plotting view algorithm

end

function [xnew,n,v]=secant(f, x0,x1,e,N)
% x0 is the first point
% x_end is the end point
% e is the requested precision
% N is the number of iterations

v=zeros(N+2,1);
v(1)=x0;
v(2)=x1;

for n=0:N-1
    xnew = x1 - f(x1) * (x1-x0)/(f(x1)-f(x0));
    v(3+n) = xnew;
    if abs(f(xnew)) <e
        break;
    else
        x0=x1;
        x1=xnew;
    end
end
v(n+4:end)=[];

end
person Gunther Struyf    schedule 03.05.2012
comment
В коде есть проблема с xtmp, поэтому он создает некоторые проблемы. Не могли бы вы взглянуть на него? Благодарность ! - person JAN; 03.05.2012
comment
Я случайно удалил его во время редактирования :( извините, я вернул его - person Gunther Struyf; 03.05.2012
comment
Боюсь, проблема все еще существует: ошибка при использовании аргументов horzcat CAT несовместима. в строке line([v(1:end-2) v(3:end)]',[f(v(1:end-2)) ....... действительно странно - person JAN; 03.05.2012
comment
просто c/p'ed сценарий, который я предоставил, и перезапустил его без каких-либо ошибок. Вы изменили его или использовали функцию секущей? если да, замените нули (n+1,1) на нули (длина (v)-2,1) - person Gunther Struyf; 03.05.2012

Вы можете построить функцию и результаты в виде точек рассеяния.

Сначала определим функцию векторным способом:

f(x) = @(x) ( 2*x.^3 - 4*x.^2 + 3*x );

Затем нарисуйте функцию в некотором диапазоне:

x = -10:10;
y = f(x);
figure(); plot(x,y);

Теперь покажите результаты:

hold on;
scatter(v,f(v));
person Andrey Rubshtein    schedule 03.05.2012
comment
Спасибо, но я думаю, что что-то не так с y = f(x); так как он показывает ошибку. - person JAN; 03.05.2012
comment
Извините, все в порядке. благодарю вас . Еще один вопрос, могу ли я передать секанс от начала f(x) к каждому из результатов? Я хочу видеть прогресс результатов, передавая секущие к каждому результату.. еще раз спасибо! - person JAN; 03.05.2012