2013-06-05 2 views
2

Мне нужна помощь в выяснении, как закодировать следующую проблему. Любая помощь будет принята с благодарностью!Функция Matlab с изменяющимися параметрами

Создать функцию, которая будет принимать входной вектор/массив для x (1 by n) и скалярного вход для a, и производить выходной сигнал, определяемый следующее уравнение:

y(x,a)=((xsin(ax-2))/(sqrt(1+(ax)^2) 
-π ≤ x ≤ π 
a={.5 1 1.5 2} 

Уравнение должно быть векторизованным в термины x, а результатом функции является массив y, который имеет тот же размер, что и массив x.

Напишите сценарий, который вызывает эту функцию, для вычисления y(x,a) для диапазона x, определенного выше, и каждого значения параметра a. Результаты должны храниться в матрице решений с использованием другой строки матрицы решений для каждого значения a.

До сих пор для моей функции у меня есть:

function [y] = part1(a,x) 
y=((x*sin(a*x-2))/(sqrt(1+(a*x).^2))); 
end 

Я не уверен, как вывести это в матрицу решения

Для моего сценария у меня есть:

%% 
clear,clc 

a={0.5 1 1.5 2}; 
x=-pi:0.1:pi; 

for 
    part1(x,a) 
end 

I При этом я получаю следующие ошибки:

Undefined function 'mtimes' for input arguments of type 'cell'. 

Error in part1 (line 4) 
    y=((x*sin(a*x-2))/(sqrt(1+(a*x).^2))); 

Error in labtest2 (line 8) 
    y(i,:)=part1(x,a(i)); 

EDIT

Я внес некоторые изменения и все еще получаю некоторые ошибки, которые я не могу решить.

Вот мой полный код функции следует полный код для сценария:

Функция

function [y] = part1(x,a) 

nx=numel(x); 
na=numel(a); 

y=((x.*sin(a.*x-2))./(sqrt(1+(a.*x).^2))); 
size(y)=[nx na] 
end 

сценария

%% 
clear,clc 

a={0.5 1 1.5 2}; 
x=-pi:0.1:pi; 

for i = 1:length(a) 
    y(i,:)=part1(x,a(i)); 
end 

Ошибки

Undefined function 'times' for input arguments of type 'cell'. 

Error in part1 (line 6) 
    y=((x.*sin(a.*x-2))./(sqrt(1+(a.*x).^2))); 

Error in labtest2 (line 8) 
    y(i,:)=part1(x,a(i)); 

ответ

0

Вы почти там. Обратите внимание, что вы написали

function [y] = part1(a,x) 

но вы называете его в сценарии, как

part1(x,a) 

так что вы, вероятно, следует исправить.

Несколько вещей, выскочить на меня:

  • Вы никогда не назначить выход part1(x,a) ни к чему.Вы сказали, что

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

Я полагаю, это означает, что 1-я строка соответствует part1(), оцененной для 1-го элемента a. Поскольку мы работаем на x, который является вектором, эта строка будет иметь несколько столбцов. Ваш результат действительно является матрицей. В вашем случае length(-pi:0.1:pi) == 63, поэтому size(y) == [4 63], где y - ваша матрица вывода.

  • Ваш for цикл в обратном направлении. Вам говорят, что принимают скаляр a и вектор x. Таким образом, ваш сценарий должен быть что-то вроде:

    a = 0.5:0.5:2; 
    x = -pi:0.1:pi; 
    for i = 1:length(a) 
        y(i,:) = part1(x, a(i)); 
    end 
    

Обратите внимание на использование length и оператор :. Я хочу перебирать между 1 и length(a) (в данном случае length(a) == 4), так что я могу использовать текущее значение a(i) как индекс в моей выходной матрице, y. Оператор : в y(i,:) означает «i-я строка и все столбцы y выведут значение на part1(x,a(i))».

  • Ваша функция необходимо изменить для element-by-element operations. Обратите внимание, что, например, x*sin(a*x-2) работает для скаляра x, но не векторов. Это связано с тем, что x является вектором, а sin(a*x-2) также является вектором (поскольку вызов sin будет работать поэтапно, а a - это скаляр). Попытка умножить два вектора вместе приведет к ошибкам, так как MATLAB попытается выполнить умножение . Решите это, заменив * на .*. Таким образом, недвусмысленно, что вы будете умножать эти два вектора поэтапно. Вам также необходимо будет изменить / на ./.

На другой ноте, спасибо за попытку сделать свою домашнюю работу, прежде чем просить о помощи SO. Мы получили огромный приток вопросов от студентов, которые не предпринимали никаких попыток сделать свою работу, прежде чем сбросить ее на нас, так что стало известно, что мы, завсегдатаи тегов MATLAB, получаем реальную помощь, вместо того чтобы сообщать людям делать Наша работа.

+0

Ok Я установил некоторые ошибки в коде и сделал изменения вы предложили, но я до сих пор есть две проблемы 1. Как назначить выход матрица решения для первой части? 2. В настоящее время мой код выглядит так: a = {0.5 1 1.5 2}; x = -pi: 0,1: pi; для i = 1: длина (a) y (i,:) = part1 (x, a (i)); конец Здесь я получаю сообщение об ошибке «Ошибка в labtest2 (строка 8) y (i,:) = part1 (x, a (i)); –

+0

Угадайте, я не могу добавить код в комментарии ... Я обновляю исходный вопрос с новыми вопросами/ошибками –

+0

Я просто проверил вашу функцию - вам нужно использовать умножение по элементам. См. Мое редактирование, подходящее прямо. –

2

Причина, по которой вы получаете Undefined function 'times' for input arguments of type 'cell', состоит в том, что ваша переменная a является массивом ячеек. Вы должны изменить назначение a от

a={0.5 1 1.5 2}; 

в

a=[0.5 1 1.5 2]; 

, который сделает это просто нормальный массив. В качестве альтернативы вам необходимо ссылаться на него с помощью записи ячейки: a{i} вместо a(i).

0

Наконец-то все выработалось.

Функция

function [y] = part1(x,a) 

    y=((x.*sin(a.*x - 2))./(sqrt(1 + (a.*x).^2))); 

end 

Script

%% 
clear all; 
clc; 
close all; 

x=[-pi:.1:pi]; 
a=[.5:.5:2]; 

for i=1:length(a) 
    y(i,:)=part1(x,a(i)); 

    plot(x,y) 
end 

Sol=[y] 
+0

Вам не нужно назначать вещи с помощью '[]' как у вас для 'x',' a' или 'Sol'. '-pi: .1: pi' уже является вектором, например. Фактически, бывают случаи, когда вы делаете это * плохо *. [Ссылка на соответствующее обсуждение ответов MATLAB] (http://www.mathworks.com/matlabcentral/answers/35676-why-not-use-square-brackets) –

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