Кусочные функции в MATLAB - PullRequest
0 голосов
/ 25 апреля 2018

Я только недавно начал работать с MATLAB для Uni в этом году, и в качестве вопроса о викторине для домашней работы меня попросили создать кусочную функцию (которую я назвал "piecewise_method"), которая может ввести другое уравнение для "x «в зависимости от того, находится ли« x »ниже 0, от 0 до 8 или выше 8. Вот код, который я написал до сих пор.

function solution = piecewise_method(x)

% given the value of the input x, the function
% piecewise_method will choose from one of the three specified
% equations to enact upon the given value of x
% and give the user a solution

solution = zeros(size(x));
e = exp(1);

for j = 1:size(x)
    a = x(j);

    if a < 0
        solution(j) = -a.^3 - 2*a.^2 + 3*a;
    elseif (a >= 0) && (a <= 8)
        solution(j) = (12/pi)*sin(pi*a./4);
    else
        solution(j) = ((600.*e.^(a-8))./(7*(14+6.*e.^(a-8))) - 30/7);
    end
end

При запуске с входом ...

x = -3:12

Он выдает этот результат для решения переменной ...

решение =

 0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

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

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

Если бы вы могли предоставить какие-либо предложения, которые могли бы помочь мне с этой функцией, которые были бы очень благодарны, спасибо!

P.S. Если у вас есть какие-либо предложения по улучшению моих вопросов в будущем, это тоже было бы хорошо!

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Как указано в комментариях и ответ RadioJava , вам необходимо проверить ваш цикл. Я бы использовал size(x,2) (количество столбцов в x) или numel(x) (количество элементов в x).

for j = 1:numel(x)
    % ...

Другие рекомендуют length(x), что max(size(x)). Обычно я стараюсь избегать этого, потому что неясно, какое измерение вы хотите найти для матриц.

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

function solution = piecewise_method(x)

% given the value of the input x, the function
% piecewise_method will choose from one of the three specified
% equations to enact upon the given value of x
% and give the user a solution

solution = zeros(size(x));
e = exp(1);

idx = (x<0);
solution(idx) = -x(idx).^3 - 2*x(idx).^2 + 3*x(idx);
idx = (x>=0 & x<=8);
solution(idx) = (12/pi)*sin(pi*x(idx)/4);
idx = (x>8);
solution(idx) = (600*e.^(x(idx)-8))./(7*(14+6*e.^(x(idx)-8))) - 30/7;

Обратите внимание, что вы можете легко иметь условия и (анонимные) функции в массивах и циклически выполнять их, чтобы сделать это гораздо более гибким.

0 голосов
/ 25 апреля 2018

Вы должны использовать length вместо size в цикле for.

Выход функции size - это размеры x, которые для вашего примера x=-3:12 возвращают size(x)=[1 16]. Тогда ваш цикл for будет выполняться для j=1:size(x), т.е. j=1:1, т.е. j=1.

Вывод length - это длина наибольшего измерения массива x, как указано здесь . В вашем примере: length(x) = 16, затем j=1:length(x)=1:16.

Или вы можете использовать size(x,2), который будет возвращать размер 2-го измерения x, такой же, как length в этом случае.

...