2013-12-12 2 views
1

Итак, я пытаюсь закодировать функцию, которая реализует метод secant для функции (f), которая будет введена пользователем и добавит результат каждой итерации к вектор. Я получаю сообщение о том, что x не определено, что понятно, но я не уверен, как его определить. Я пытаюсь написать его таким образом, что аргумент f может быть функцией в терминах x, например. x^3 +12, в отличие от имени отдельного файла функции.Matlab - функция, определенная пользователем как аргумент функции

function [xans, xi, iter] = secant(f, x0, x1, tol) 

    k = 1; 
    a = x0; 
    b = x1; 
    c = f(b)*((b-a)/(f(b)-f(a))); 

    while abs(c) >= tol 
     xi(k) = b-c; 
     a = b 
     b = xi(k) 
     k = k+1; 

    end 
disp(x) 
disp(xi) 
disp(iter) 

ответ

0

function_handle Использование:

[xans,xi,k] = secant(@myFunc,1,2,0.0001); 

Кроме того, вызовите Funciton внутри цикла, в противном случае, он не обновляется:

function [xans, xi, k] = secant(f, x0, x1, tol) 

    %// etc. 

    while abs(c) >= tol 
     c = f(b) * (b-a)/(f(b)-f(a)); 
     %// etc. 
    end 
end 
+0

Если не '@' появляются только тогда, когда функция вызывается? Я имею в виду '[xans, xi, k] = secant (@sin, x0, x1, tol);'. – pm89

+0

Да, я думаю, что исходный синтаксис в вопросе правильный, но дескриптор функции должен быть отправлен в функцию 'secant'. – pm89

+0

Я получаю неверную синтаксическую ошибку в @f сейчас и все еще получаю сообщение об ошибке «Неопределенная функция или переменная« x »при запуске программы. Чтобы уточнить, я хотел, чтобы функция f была функцией с точки зрения x, например. x^4 + 12x, а не имя функции. – ttl

2

Вы, кажется, немного запутались петли и функций в Matlab. Функция, которую вы написали, не выполняет никакого обновления переменных внутри цикла. Когда вы пишете

c = f(b) * (b-a)/(f(b) - f(a)); 

, который хранит один значение в c, но он не обновляется автоматически c каждый раз, когда вы идете через петлю. Вместо этого я бы написал что-то вроде этого

function x1 = secant(f, x0, x1, tol) 

y1 = f(x1); 
y0 = f(x0); 
while abs(y1) > tol 
    tmp = x1;        %// Store the old value of x1 
    x1 = x1 - y1 * (x1 - x0)/(y1 - y0); %// Use the secant method to update x1 
    x0 = tmp;        %// x0 gets the old value of x1 
    y0 = y1;        %// We already know what f(x0) is 
    y1 = f(x1);       %// Need to re-compute f(x1) 
end 

, которое затем можно вызвать следующим образом. Первый аргумент известен как дескриптор функции .

>> secant(@(x)x^2-2, 0, 1, 1e-6) 
ans = 
    1.414213562057320 
0

Выполнить вашу функцию с >>secant(@(x) x^3 +12, x0, x1, tol)

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