2016-04-02 5 views
0

Я пытаюсь нарисовать поверхность с диагональной матрицей, уравнение, которое я использую, - это f = x^T D x, x - вектор 2 на 1, а D - 2 на 2 матрица.поверхностный участок в Matlab

Вот что до сих пор, но я продолжаю получать ошибки.

x = linspace(-10,10); 
y = linspace(-10,10); 
[X,Y] = meshgrid(x,y); 
D = [1 0; 0 1]; 

f = @(x,y) [x,y]*D*[x,y].'; % [x,y] is 1 by 2 

contour (X,Y,f(X,Y)) 

Может ли кто-нибудь сказать мне, как избавиться от этой ошибки? Благодаря

+0

Вы утверждаете, что "' [х, у] '1 на 2". Это неверно и является основной причиной вашей проблемы. – mikkola

+0

@mikkola Я не знаю, почему это не так. Я проверяю, что [x, y] дает матрицу 1 на 2. – Simple

+0

'X' и' Y' равны 100 на 100. Таким образом, когда вы вводите их в 'f' и эффективно выполняете' [X, Y] ', результатом является матрица 100 на 200. – mikkola

ответ

2

С x и y имеет одинаковую длину, ваша диагональная матрица D должна быть квадратной матрицей размера п х п, с п, равным удвоенной длиной ваших x или y векторов. Причина, по которой вам нужно умножить длину на две, заключается в том, что операция [x,y] объединяет массивы по горизонтали, дублируя одно из измерений.

В этом примере D - это матрица идентичности. См. eye для получения дополнительной информации.

x = linspace(-10,10); % x is 1x100 
y = linspace(-10,10); % y is 1x100 
[X,Y] = meshgrid(x,y); % X is 100x100 and Y is 100x100 
D = eye(2*numel(x)); % D is 2*100x2*100 = 200x200 

f = @(x,y) [x,y]*D*[x,y].'; % [X,Y] is 100x200 and [X,Y].' is 200x100 

contour (X,Y,f(X,Y)) 

Если вы хотите D быть случайной диагональную матрицу, вы можете сделать это сочетание diag с одним из Random Number Generation доступных функций, как, например, randn.

На предыдущем примере замените D со следующей инструкцией:

D = diag(randn(1,2*numel(x))); 

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

Попробовать заменить D со следующими инструкциями:

v = 1:2*numel(x); % vector of coefficients: v = [1 2 ... 200] 
D = diag(v); 
+0

Если D не является единичной матрицей, это случайная диагональная матрица, как я могу это сделать. – Simple

+0

@ Простой. Я отредактировал ответ для запроса вашего запроса. – codeaviator