2012-05-03 3 views
2

Я написал код для алгоритма secant, и теперь у меня есть функция:Как построить функцию, используя код, который я написал с начальной точкой?

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

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

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

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

v = 
    -4.0000 
    2.2069 
    2.3699 
    2.6617 
    2.5683 
    2.5804 

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

Буду признателен, если вы сможете объяснить.

EDIT:

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

[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 

Спасибо.

ответ

1

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

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

function [ ] = tmp1() 

    [email protected](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 
+0

У кода возникла проблема с "xtmp", поэтому он создает некоторые проблемы, не могли бы вы дать ему посмотреть? благодаря ! – ron

+0

Я случайно удалил его во время редактирования :(sry, я положил его обратно –

+0

Я боюсь, что все еще есть проблема: «Ошибка при использовании horzcat Параметры аргументов CAT несовместимы « в строке «line ([v (1: end-2) v (3: end)] ', [f (v (1: end-2)) ....... "действительно weird – ron

1

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

Во-первых, определить функцию в vectorical образом:

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

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

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

Теперь, показать resuls:

hold on; 
scatter(v,f(v)); 
+0

Спасибо, но я думаю, что что-то не так с "y = f (x);" поскольку он отображает ошибку. – ron

+0

@ron, какая ошибка? –

+0

Простите, все в порядке. Спасибо . Еще один вопрос: могу ли я передать секущий от начала f (x) к каждому из результатов? Я хочу видеть прогресс результатов, передавая секущие каждому результату. Еще раз спасибо! – ron

 Смежные вопросы

  • Нет связанных вопросов^_^