Нужна функция Matlab Newton Raphson

у меня есть многочлен f (x) = x ^ 3-a, и мне нужна его функция Matlab с параметрами

function [x,err]=cubic1(a,xinit,eps), где xinit: начальное приближение eps: итерации выполняются до тех пор, пока ошибка приближения не станет меньше этого числа x: корневые приближения функции, и это массив. relerr: приблизительные ошибки, соответствующие итерациям, и это массив.

у тебя есть идеи ?


person Jeam    schedule 25.11.2013    source источник
comment
Этот вопрос требует много работы, чтобы быть жизнеспособным. Вам необходимо: (1) показать, что вы понимаете, что пытаетесь сделать. (2) покажите нам, что вы пробовали и почему вы думаете, что это не удается. (3) сформулировать реальный вопрос.   -  person carlosdc    schedule 25.11.2013


Ответы (2)


function [x,err] = cubic1(f,df_dx,x0,eps)
   err = Inf;
   x = x0;
   while abs(err) > eps
      x_old = x;
      x = x_old - f(x_old)./df_dx(x_old);
      err = x - x_old;
   end

Чтобы вызвать функцию cube1,

a = 1; % you can change a
f = @(x)(x.^3-a);
df_dx = @(x)(3*x.^2);
x0 = 1;
eps = 1e-7;
[x,err] = cubic1(@f,@df_dx,x0,eps);
person lennon310    schedule 25.11.2013
comment
Здесь то, что называется cube1, должно быть названо newtonraphson, а второй блок кода должен быть обернут реальной процедурой Cuba1, имеющей требуемую сигнатуру. - person Lutz Lehmann; 13.12.2013
comment
Спасибо ЛутцЛ. Я просто использовал имя функции, предоставленное Jeam. И Cubase1 можно использовать для решения любой заданной функции, если вы также вычислите df_dx. - person lennon310; 13.12.2013
comment
Да, конечно, но cube1(a,xinit,eps), как следует из названия, предназначен для вычисления кубического корня из a, начиная с xinit, с точностью до eps. Таким образом, из вашей нижней части кода можно было бы взять определения f, df_dx и вызова newton(@f,@df_dx,xinit,eps); и поместить это как тело функции cube1. - person Lutz Lehmann; 13.12.2013
comment
Извините, но я все еще не совсем понимаю ваше второе мнение. Не могли бы вы добавить свою функцию ниже в качестве дополнительной? Спасибо - person lennon310; 13.12.2013

Дополнение о переименовании функций в решении lennon310

файл куб1.м

function [x,err] = cubic1(a,xinit,eps)
    f = @(x)(x.^3-a);
    df_dx = @(x)(3*x.^2);
    [x,err] = newton_root(@f,@df_dx,xinit,eps);
end

function [x,err] = newton_root(f,df_dx,x0,eps)
    err = Inf;
    x = x0;
    while abs(err) > eps
        x_old = x;
        x = x_old - f(x_old)./df_dx(x_old);
        err = x - x_old;
    end
end

Можно получить более быструю сходимость с помощью метода Ньютона для f (x) = x ^ 2-a / x,

файл куб2.м

function [x,err] = cubic2(a,xinit,eps)
    err = Inf;
    x = xinit;
    while abs(err) > eps
        x3=x.^3;
        x_new = x*(x3+3*a)/(3*x3+a);
        err = x_new - x;
        x=x_new
    end
end
person Lutz Lehmann    schedule 13.12.2013