Графические полиномы в MATLAB

Мне нужно создать многочлен вида:

P(x) = q(1,1) + q(2,2)(xz(1)) + q(3,3)(xz(1))(xz(2)) + --- + q( 2n, 2n)(xz(1))(xz(2))...(xz(2n)) ПРИМЕЧАНИЕ. Индексы уравнения были сдвинуты для соответствия MATLAB.

в МАТЛАБ. Ознакомьтесь со слайдами 15 и 16 по этой ссылке.

У меня заполнена матрица Q, поэтому у меня есть диагональ, а также заполнено z(1:2n).

Мне трудно понять, как создать полином, чтобы я мог изобразить этот полином. Я пытался использовать цикл for для добавления каждого члена к P(x), но он работает не так, как я думал.

До сих пор мой код вычислял коэффициенты (представленные как Q(0,0) -> Q(2n+1, 2n+1) в задаче выше) без проблем.

У меня проблема с построением многочлена степени n формы, описанной выше. Построение графика теперь имеет больше смысла, создайте вектор x с оценочными значениями, а затем пропустите их через полиномиальную «функцию» и нарисуйте вектор x против результирующего вектора.

Так что мне просто нужно создать этот полином.


person Neurax    schedule 04.05.2014    source источник


Ответы (1)


Я бы использовал diag и cumprod, чтобы помочь вам в этом. Сначала используйте diag, чтобы извлечь диагонали вашей матрицы Q. После этого используйте cumprod для создания вектора совокупных продуктов.

Как cumprod работает с вектором, так это то, что для каждого элемента вектора i-й элемент собирает продукты от 1 до i-го элемента. Например, если бы у нас был вектор V = [1 2 3 4 5], cumprod(V) дал бы [1 2 6 24 120]. 4-й элемент (в качестве примера) будет 1*2*3*4, представляющим продукты с 1-го по 4-й элемент.

Таким образом, это код, который я бы сделал:

qdiag = diag(Q);
xMinusZ = x - z; % Takes z and does x - z for every element in z
cumProdRes = cumprod(xMinusZ);
P = sum(qdiag .* [1;cumProdRes(1:end-1)]);

P должно дать вам P(x) то, что вы хотели. Убедитесь, что z является вектором-столбцом, чтобы сделать его совместимым с диагоналями, извлеченными из Q.

Примечание: я полагаю, что в вашем уравнении допущена опечатка. Последний член вашего уравнения (согласно вашему соглашению) должен иметь (x-z(2n-1)), а не (x-z(2n)). Это потому, что первый член в вашем уравнении не имеет z.

Вот пример. Предположим, что Q определено

Q = [1 2 3 4; 5 6 7 8; 9 10 11 12; 13 14 15 16];

Вектор z:

z = [4;3;2;1];

Давайте оценим функцию в x = 2

Извлечение диагоналей Q должно дать нам Q = [1;6;11;16]. Вычитание x из каждого элемента z должно дать нам:

xMinusZ = [-2;-1;0;1];

Используя уравнение, которое у вас есть выше, мы имеем:

P = 1 + 6*(-2) + 11*(-2)*(-1) + 16*(-2)*(-1)*(0) = 11

Вот что должен дать код.

Что, если мы хотим сделать это для более чем одного значения x?

Как вы указали в своем посте, вы хотите оценить это для ряда значений x. Таким образом, вам нужно изменить код, чтобы он выглядел так (убедитесь, что x является вектором-столбцом):

qdiag = diag(Q);
xMinusZ = repmat(x,1,length(z)) - repmat(z',length(z),1);
cumProdRes = cumprod(xMinusZ,2);
P = sum(repmat(qdiag',length(z),1).*[ones(length(z),1) cumProdRes(:,1:end-1)],2);

P теперь должен дать вам вектор выходных данных, поэтому, если вы хотите построить это, просто выполните plot(x,P);

person rayryeng    schedule 04.05.2014
comment
Я столкнулся с целой кучей проблем с индексацией. В представленной мне задаче используется [x0, x1, x2, x3, x4], поэтому они повторяются от 0 до n, где n будет равно 4. Моя реализация MATLAB использует индексирование на основе 1, поэтому я иду от [x1 x2 x3 x4 x5] и мое n = 5. Псевдокод использует от Q(0,0) до Q(2n+1,2n+1), что в этих глазах будет от 0 до 9, где я использую от 1 до 10, поэтому 2н. - person Neurax; 04.05.2014
comment
Кроме того, было бы лучше, если бы вы вставили неизмененное уравнение, чтобы я мог перевести его сам. Поместите тот, который имеет смещение 0 вместо 1. Таким образом, двусмысленности не будет. Пожалуйста, отредактируйте свой пост, чтобы отразить это, и я отредактирую свой код. - person rayryeng; 04.05.2014
comment
На самом деле это уже не проблема индекса, а скорее вопрос о том, как мне создать этот полином степени n. - person Neurax; 04.05.2014
comment
Хорошо. Ну, я вижу, вы приняли мой ответ. Рад, что смог помочь! - person rayryeng; 05.05.2014
comment
Пришлось поиграть со 2-й и 4-й строкой вашего нижнего выбора, чтобы получить правильные размеры матрицы, но я прошел итеративно и полностью понял ваш метод. - person Neurax; 06.05.2014