2013-02-13 3 views
0

Как домашнее задание, я пишу код, который использует метод bisection для вычисления корня функции с одной переменной в пределах диапазона. Я создал функцию пользователя, которая выполняет вычисления, но один из входов функции должен быть «забавным», который должен быть установлен равным функции.Как установить функцию в переменную в MATLAB

Вот мой код, прежде чем идти дальше:

function [ Ts ] = BisectionRoot(fun,a,b,TolMax) 

%This function finds the value of Ts by finding the root of a given function within a given range to a given 
%tolerance, using the Bisection Method. 

Fa = fun(a); 
Fb = fun(b); 
if Fa * Fb > 0 
    disp('Error: The function has no roots in between the given bounds') 
else 
    xNS = (a + b)/2; 
    toli = abs((b-a)/2); 
    FxNS = fun(xns); 
    if FxNS == 0 
     Ts = xNS; 
     break 
    end 
    if toli , TolMax 
     Ts = xNS; 
     break 
    end 
    if fun(a) * FxNS < 0 
     b = xNS; 
    else 
     a = xNS; 
    end 
end 

Ts 

end 

входные аргументы определяются нашим учителем, поэтому я не могу возиться с ними. Мы должны установить эти переменные в командном окне до, выполняющего функцию. Таким образом, мы можем использовать программу позже для других вещей. (Хотя я думаю, что fzero() может быть использован для этого)

Моя проблема в том, что я не уверен, как отвлекаться на что-то, а затем использовать это так, чтобы я мог весело (a) или забавой (b). В нашей книге они делают то, что они называют определением f (x) как анонимная функция. Они делают это для примера проблемы:

F = @ (x) 8-4.5*(x-sin(x)) 

Но когда я пытаюсь сделать это, я получаю ошибку, Error: Unexpected оператор MATLAB.

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

fun = 8 - 4.5*(x - sin(x)) a = 2 b = 3 TolMax = .001

Ответ на получение в книге для использования: 2.430664.

Я уверен, что ответ на этот вопрос невероятно прост и прост, но по какой-то причине я не могу найти способ сделать это! Спасибо за помощь.

+1

Там опечатка здесь: 'F = @ (х) 8-4.5 * (х-sin9 (х))' , это должно быть 'F = @ (x) 8-4.5 * (x-sin (x))'. Кроме того, строка 'if toli, TolMax' не будет делать то, что вы хотите, вероятно, вы пропустили знак' == '? Наконец, я не вижу никакого цикла в функции, которая позволяла бы итерационное решение. – Jonas

+0

Извините, компьютер, на который я писал, имеет довольно дерьмовую клавишу переключения. Мне пришлось переписывать так много вещей. Наверное, я пропустил два! Благодарим за указание этого. На самом деле это должно быть <. Я добавил в цикл! Не могу поверить, что я забыл об этом! – TheTreeMan

ответ

3

Чтобы понять, как выглядит ваш пример, отсутствует синтаксис. Вместо того, чтобы любой из них (из Вашего вопроса):

fun = 8 - 4.5*(x - sin(x)) % Missing function handle declaration symbol "@" 
F = @ (x) 8-4.5*(x-sin9(x)) %Unless you have defined it, there is no function "sin9" 

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

fun = @(x) 8 - 4.5*(x - sin(x)) 

Тогда вы могли бы назвать вашу функцию так:

fun = @(x) 8 - 4.5*(x - sin(x)); 
a = 2; 
b = 3; 
TolMax = .001; 
root = BisectionRoot(fun,a,b,TolMax); 

Для отладки (который вам вам нужно будет сделать), используйте отладчик.

  1. Команда dbstop if error останавливает выполнение и открывает файл в точке проблемы, что позволяет исследовать значения переменных и стека функций.

  2. Нажатие на отметки «-» в редакторе создает точку прерывания, заставляя функцию приостанавливать выполнение в этой точке снова, чтобы вы могли проверить содержимое. Обратите внимание, что вы можете выполнить код по строкам, используя кнопки отладки в верхней части редактора.

  3. dbquit выходит из режима отладки

  4. dbclear all очищает все точки разрыва

+0

Да, я сделал несколько ошибок в коде. Я просто не мог запустить код и исправить его, не зная, как сделать анонимную функцию! Я исправил его и получил код. Большое вам спасибо за вашу помощь! – TheTreeMan

+0

Поздравляем. – Pursuit

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