2013-04-14 3 views
4

я пытаюсь сделать такую ​​функцию в MATLAB enter image description hereфункции MATLAB работает неправильно

Он должен быть массив l_k Wheres kfrom 1 to n но однако.

Код: x - некоторый вектор (массив), z - scalar; в коде w - верхняя часть ГРП, а g - ниже.

function out_l = l_k(z, x) 
%вычисления массива l_k для числа z 
%x - узлы интерполяции 
%z - значение для которог овычисляем значение полинома 
n = size(x); 
w = 1; 
g = 1; 
out_l = zeros(n); 

for k = 1:n 

    for j = 1:n 
    %вычислим w 
     for i=1:n 
      if((i ~= k) && (i ~= j)) 
       w = w * (z - x(i)); 
      end 
     end 
    %вычислим g 
     for i=1:n 
      if(i ~= k) 
       g = g * (x(k) - x(i)); 
      end 
     end 

    end 
    out_l(k) = (w/g); 
end 
end 

Проблема - когда дело доходит до этого для циклов, это просто выходит после первого запуска проверки! Что случилось?

%вычислим w 
      for i=1:n 
       if((i ~= k) && (i ~= j)) 
        w = w * (z - x(i)); 
       end 
      end 
     %вычислим g 
      for i=1:n 
       if(i ~= k) 
        g = g * (x(k) - x(i)); 
       end 
      end 

ответ

1

Линия n = size(x); не имеет смысла, если вы хотите, количество элементов в n (size возвращает ряд векторных измерений, а не скаляр). Вместо этого попробуйте n=numel(x);.

Позже изменения: Я также вижу, что вы распределяете свои выходные данные, как это: out_l = zeros(n);, но вы должны знать, что он создает матрицу NxN, а не массив, как вы можете ожидать. Попробуйте out_l = zeros(1,n); для разнообразия.

И еще один совет: если у вас есть сомнения, используйте клавишу F1 как можно чаще. :-) Интегрированная справка Matlab очень хороша в объяснении материала Matlab.

1

Matlab имеет встроенные функции для выполнения интерполяции, такие как interp1; (Я могу распознать интерполяционные функции Лагранжа в вашей формуле).

Если вы хотите иметь собственный код для оценки интерполяционных функций Лагранжа, вам следует использовать векторы и избегать циклов, чтобы ускорить работу вашего кода.

Рассмотрим следующий пример:

x_n = 0:.3:1; % # interpolation nodes 

k = 3;  % # we want for instance the function which is equal to 1 at 3rd node 

z = .5;  % # we want to evaluate the interpolant at z=.5 


x_n_l = x_n; 
x_n_l(k) = []; % # we need all the nodes but the k-th 

l_k = prod(z - x_n_l)/prod(x_n(k) - x_n_l) % # this is your value 

Конечно, вы можете обернуть код в хорошей функции.

+0

О, это выглядит сложным -_- – DanilGholtsman

+0

Я никогда не использовал matlab до на прошлой неделе – DanilGholtsman

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