Ошибка измерения матрицы при вызове mldivide в MATLAB

Я получаю эту ошибку при запуске моего кода:

Ошибка при использовании ==> mldivide Размеры матрицы должны совпадать.

Вот мой код:

%make the plots of phase and group velocity vs discreteness of the grid
c=1;

a=input('Please enter the ratio cdt/dx : ')

figure(1)
R=2:40;
plot(R,phase_vel(R,a)/c)
xlabel('R=l/dx')
ylabel('u_phase/c')

%figure(2)
%plot(group_vel(R,a),R,0,40)
%xlabel('R=l/dx')
%ylabel('u_group/c')

и вот мои функции:

function phase_velocity = phase_vel(R,a)
    %numerical phase velocity of the discrete wave 
    c=1;
    phase_velocity=(2*pi*c)/(R*knum(R,a));
end

function group_velocity =group_vel(R,a )
    %numerical group velocity of the discrete wave
    c=1;
    group_velocity=(a*sin(knum(R,a)))/(sin(2*pi*a/R))
end

function knumber = knum(R,a)
    %This is the k wave number
    knumber=acos((1/a)^2*(cos(2*pi*a/R)-1)+1);
end

Как я могу решить эту ошибку?

EDIT: я использовал . оператор в каждом уравнении, и я изменил пределы R = 4:40


person George    schedule 29.03.2011    source источник
comment
У меня нет набора инструментов Symbolic Math Toolbox, которым, похоже, пользуетесь вы, поэтому следующие вопросы могут быть бессмысленными: (1) Ошибка возникает в первом plot или во втором? (2) Если с первым все в порядке, а со вторым нет, поможет ли вам сказать omega=2*pi/R/dt; вместо omega*dt==2*pi/R;, чтобы там не было решения уравнения?   -  person Gareth McCaughan    schedule 29.03.2011
comment
Вы предоставили много строк кода, было бы очень полезно знать, в какой строке какой функции ваш код дает сбой.   -  person shahar_m    schedule 29.03.2011
comment
Здравствуйте, проблема именно в команде plot (первый график) в первом скрипте. Оба графика дают мне одинаковые ошибки (я пробовал omega = 2 * pi / R * dt, но все равно)   -  person George    schedule 29.03.2011


Ответы (2)


Если ваша цель — применить ваши формулы к каждому отдельному значению в векторе R, вам следует выполнять все свои вычисления, используя поэлементные арифметические операторы .*, ./ и .^ вместо матричных операторов *, / и ^.

Ваша ошибка, вероятно, возникает при первом вызове вашей функции knum, в частности, когда вы пытаетесь вычислить 2*pi*a/R. Поскольку 2*pi*a — это одиночное скалярное значение, вы получите ошибку при попытке выполнить деление матрицы вправо / с помощью вектора-строки R. Самое действительно странное сообщение об ошибке:

??? Error using ==> mldivide
Matrix dimensions must agree.

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

person gnovice    schedule 30.03.2011
comment
@George: Ты заменил все * и / на .* и ./? - person gnovice; 30.03.2011
comment
@George: Тогда вы не должны по-прежнему получать то же самое сообщение об ошибке, если только ошибка не исходит из другой части вашего кода, которую вы не включили выше. Какую другую информацию (например, номер строки) содержит ваше сообщение об ошибке? - person gnovice; 30.03.2011
comment
@gnovice: я включил все (и спасибо за помощь). Вот другие ошибки: Ошибка в ==> knum at 4 knumber=acos((1/a).^2.*(cos(2.*pi. *а/Р)-1)+1); Ошибка в ==› Phase_vel при 5 Phase_velocity=(2.*pi.*c)/(R.*knum(R,a)); Ошибка в ==› Phase_plot на 8 графике (R, Phase_vel (R, a)/c) - person George; 30.03.2011
comment
@gnovice: я только что понял, что не использовал . при каждом / !! Извините! Я пропустил это! Теперь все в порядке! Спасибо за помощь! - person George; 30.03.2011

У меня нет Symbolic Math Toolbox, но ваша проблема, похоже, в том, что вы используете plot, функцию, которая может работать с массивами чисел, и передаете ей результат символьного вычисления. Посмотрите справку Matlab, где раздел Создание графиков of Symbol Functions предлагает использовать ezplot(). В качестве альтернативы вам нужно оценить ваше символьное выражение для определенных входных значений, чтобы создать массив чисел, с которым может работать plot, но вы не можете использовать для этого double(), так как он не будет знать, какие числа вставлять в ваши переменные.

person Community    schedule 29.03.2011
comment
Здравствуйте, ezplot принимает дескрипторы функций (если я не ошибаюсь), но у меня есть две функции, которые я хочу сохранить. Что касается входных значений, которые вы сказали для создания массива, я не понял, что вы имеете в виду. - person George; 29.03.2011
comment
Если я правильно прочитал ваш код, вы пытаетесь построить свою функцию Phase_vel с R, изменяющимся от 0 до 40. Это совсем не синтаксический график, с которым может справиться. Как я уже сказал, я не могу проверить это здесь, попробуйте: plot(0:40,double(phase_vel((0:40),a)/c)... это пытается передать массив R- значения в вашу функцию, преобразуйте результаты в двойной (т.е. числовой) массив и передайте их функции построения графика. - person Jonas Heidelberg; 29.03.2011
comment
Здравствуйте, спасибо за помощь. Я попробовал, и это дает мне ошибку при использовании ==> mupadmex Ошибка в команде MuPAD: DOUBLE не может преобразовать входное выражение в двойной массив. - person George; 29.03.2011