Форум программистов, компьютерный форум, киберфорум
Наши страницы
Matlab
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.82/28: Рейтинг темы: голосов - 28, средняя оценка - 4.82
Vjik
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 6
1

Построение нескольких графиков через Plot из функции с условием if

27.03.2013, 23:20. Просмотров 5355. Ответов 6
Метки нет (Все метки)

Мы должны построить функцию F на участке -4:0.5:10, которая должна описывать 3 разных функции на 3х участках значений. F должна быть описана в отдельной функции
Описал функцию.
Matlab M
1
2
3
4
5
6
7
8
9
10
11
function [y] = F(x)
if (x>=-4) & (x<-1)
    y=(sin(x-2)).^2+2;
    end
if (x>=-1)&(x<6)
    y=(abs(x-6)).^(1/2);
    end
if (x>=6)&(x<=10)
    y=5-x;
    end
end
Теперь тело основной программы:
Matlab M
1
2
x=-4:0.5:10
plot(x,F(x));
Если делаю так - выдает ошибку, ссылаясь на первый if. Возможно из-за того, что х - вектор строка? хотя при построении графика он же передает в функцию конкретное значение х.
Если делал цикл внутри функции
Matlab M
1
2
3
for x=-4:0.5:10
внутри вся функция
end
то не выдает ошибку,А выдает график, с точкой по координатам 0;-5

Добавлено через 17 минут
эм, честно хотел поставить теги матлаба, когда заметил, что забыл, но не нашел функции "редактировать сообщение"

Добавлено через 7 минут
Работает таким образом в основном теле (в функциях F1 F2 F3 отдельно записаны функции), правда совсем уж по точкам, т.к. цикл, не соедиянят их.
Matlab M
1
2
3
4
5
6
7
8
9
10
figure; hold on
for x=-4:0.5:-1
    plot(x,F1(x));
end
for x=-1:0.5:6
    plot(x,F2(x));
end
for x=6:0.5:10
    plot(x,F3(x));
end
Но мне нужно чтобы эта кусочная функция была в одной функции F, чтобы потом использовать ее в subplot

Добавлено через 3 часа 18 минут
ап. ребят, мне лабу надо сделать к вечеру четверга, помогите плиз, не могу понять чем ему так if с "&" внутри не нравится, в чем ошибка
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.03.2013, 23:20
Ответы с готовыми решениями:

Построение нескольких кривых одной функцией plot
Играюсь с одной анимацией в которой из-за большого количества обьектов начинает подтормаживать. В...

Построение нескольких графиков
нужно вывести несколько графиков. когда строю первый,все выходит ...

Построение нескольких графиков в одном окне
Здравствуйте. Всех с прошедшими праздниками. При построение графиков в одном окне с помощью...

Построение нескольких графиков при различных значениях фактора скругления
Имеется код программы: clear;clc; br = 1000; %скорость передачи, бит/с carrier = 4000; %несущая...

Построение графиков функции нескольких переменных в TChart
Например, есть функция нескольких переменных float y, x, z; x = 2; for(z = 1; z &lt;= 10; z +=0.5){...

6
Зосима
4995 / 3356 / 327
Регистрация: 02.04.2012
Сообщений: 6,256
Записей в блоге: 16
Завершенные тесты: 1
28.03.2013, 10:47 2
Если ты хочешь делать через if, то тогда нужно сравнивать поэлементно:
Matlab M
1
2
3
4
5
6
7
8
9
10
11
function y = F(x)
for i = 1:length(x)
    if (x(i)>=-4) & (x(i)<-1)
        y(i) = sin(x(i)-2)^2 + 2;
    elseif (x(i)>=-1)&(x(i)<6)
        y(i) = sqrt(abs(x(i)-6));
    elseif (x(i)>=6)&(x(i)<=10)
        y(i) = 5 - x(i);
    end
end
end
А вот вариант для продвинутых :
Matlab M
1
2
3
4
5
function y = F(x)
y = ((x>=-4)&(x<-1)).*((sin(x-2)).^2+2) + ...
    ((x>=-1)&(x<6)).*sqrt(abs(x-6)) + ...
    ((x>=6)&(x<=10)).*(5-x);
end
Ну и дальше в скрипте или командном окне набираешь:
Matlab M
1
2
>> x=-4:0.5:10;
>> plot(x,F(x));
И радуешься горбатому графику
1
Vjik
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 6
28.03.2013, 11:14  [ТС] 3
Про первый вариант - подозревал, что надо задавать индекс элемента вектора х, но мысль до конца не дошла, спасибо)
На счет варианта для продвинутых - у меня сейчас нет возможности проверить в матлаб, объясни, пожалуйста, синтаксис я правильно понимаю - если выполняется логическое выражение, то получаем "1" и умножаем его на само выражение. Идея класс, снова поражаюсь своей глупости. Но зачем там дальше "+ ..." ? Если надо еще что то дописать?.... а, понял, это "перенос"/"переход" на следующую строку?
И еще не понял, почему в варианте "для продвинутых" мы можем обращаться к х не поэлементно?

Добавлено через 13 минут
Зосима, тогда можешь объяснить мне на понимание функции plot. Она ведь наверняка строит по заданным точкам нашего вектора заданого х, plot(x,F(x)) . Plot каждый раз передает текущее значение х в функцию F(x), на что получает выходное значение и добавляет такую точку на графике. Но тогда я не понимаю, почему, если мы используем "if", надо обращаться поэлементно, ведь внутри функции работаем с конкретным х, а не вектором х, т.е. х имеет одно единственное значение внутри функции. Ох, сколько непонимания...
0
Зосима
4995 / 3356 / 327
Регистрация: 02.04.2012
Сообщений: 6,256
Записей в блоге: 16
Завершенные тесты: 1
28.03.2013, 11:39 4
Цитата Сообщение от Vjik Посмотреть сообщение
правильно понимаю - если выполняется логическое выражение, то получаем "1" и умножаем его на само выражение.
точно
Цитата Сообщение от Vjik Посмотреть сообщение
это "перенос"/"переход" на следующую строку?
верно!
Цитата Сообщение от Vjik Посмотреть сообщение
почему в варианте "для продвинутых" мы можем обращаться к х не поэлементно?
потому как мы работаем во всем массивом х целиком! в результате сравнения ((x>=-4)&(x<-1)) получаем вектор такой же длинны как и х: там где условие выполняется будут единички, где не выполняются - будут нолики (подробнее можешь тут глянуть: http://www.cyberforum.ru/blogs/261218/blog931.html )

Функция принимает вектор целиком! а внутри функции этот вектор обрабатывается поэлементно(в первом случае) или целиком (для продвинутых). Смекаешь?
0
Vjik
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 6
28.03.2013, 12:04  [ТС] 5
хм. все таки... если функция принимает вектор целиком, то например:
Matlab M
1
2
function [y]=f(x)
y=x.^2+1
А в теле матлаба пишем
Matlab M
1
2
x=-10:0:10
plot(x,f(x))
Будет работать следующим образом - в функцию передается весь вектор х. Мы поэлементно считаем y (для чего и делаем .^, чтобы избежать матричного возведения в степень) и возвращаем значение по одному в plot, который построит по этим точкам! А когда я делал в "if" условие "x>-4 & x<-1" то он пытался сравнить весь вектор! Оппа.
Я правильно все понял? Если так, то здорово, значит разобрался)

а если в функции например y=x+1. На выходе из функции у нас получается вектор значений y? Вот как оно наверно правильнее, и в первом примере тоже. На выходе у нас вектор значений. и plot строит график по вектору x и выходному вектору функции
0
Зосима
4995 / 3356 / 327
Регистрация: 02.04.2012
Сообщений: 6,256
Записей в блоге: 16
Завершенные тесты: 1
28.03.2013, 12:50 6
Цитата Сообщение от Vjik Посмотреть сообщение
он пытался сравнить весь вектор! Оппа.
Я правильно все понял?
Точно!

Цитата Сообщение от Vjik Посмотреть сообщение
plot строит график по вектору x и выходному вектору функции
да тупо по точкам, если длины х и у будут разными, будет ругаться
1
Vjik
0 / 0 / 0
Регистрация: 15.03.2013
Сообщений: 6
28.03.2013, 17:52  [ТС] 7
Зосима, вооот, спасибо)
остался один вопрос. я просто уже убегаю, нету времени часик посидеть - по разбираться.
нужно через subplot построить нашу основную функцию F(x) и еще 3 графика, с кусками, из которых она состоит. Функции заданы F1(x),F2(x),F3(x). Заданны не на определенном промежутке, а в общем. Как я попытался набросать:
Matlab M
1
2
3
4
5
6
7
8
9
10
11
x=-4:0.5:10;
subplot(2,2,1); plot(x,F(x))
for i=1:length(x)
    if (x(i)>=-4)&(x(i)<-1)
        subplot(2,2,2); plot(x,F1(x));
    elseif (x>=-1)&(x<6)
        subplot(2,2,3); plot(x,F2(x));
    elseif (x>=6)&(x<=10)
        subplot(2,2,4); plot(x,F3(x));
    end
end
выдает два графика - верно F(x), и с неправильно выдает F1(x), т.к. выводит не на [-4;1), а на [-4;10]. И я понимаю ошибку, как мне кажется:
хоть я и вызываю функцию F1(x) внутри цикла, но я ей передаю весь вектор х, соответственно она строит график на всей области х. Тут кажется понятно, пока не придумал, как это обойти.
И второе - не пойму, почему построил только F(x) и F1(x)? ведь для subplot вроде бы не надо использовать Hold on и т.д. Тогда почему он пусть хотя бы и неправильно (на всем участке [-4;10], но не вывел все 4 функции на 4 графика?

Добавлено через 4 часа 25 минут
Так, ну почему он строит F1(x) на всем промежутке понятно, мы же весь вектор передаем, а не x(i). Как правильно сделать - пока не придумал, а осталось...ааааааа.... 40 минут.
И все таки не пойму почему F2(x) И F3(x) вообще не выводит на subplot

Добавлено через 23 минуты
Реализовал таким вот образом... но очень мне он не нравится, вручную менять вектор х...
Matlab M
1
2
3
4
5
6
7
8
x=-4:0.5:10;
subplot(2,2,1); plot(x,F(x))
x=-4:0.5:-1;
subplot (2,2,2); plot(x,F1(x));
x=-1:0.5:6;
subplot (2,2,3); plot(x,F2(x));
x=6:0.5:10;
subplot (2,2,4); plot(x,F3(x));
0
28.03.2013, 17:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.03.2013, 17:52

Построение графиков функций с условием аргумента Х с заданными параметрами
Всем привет! Подскажите пожалуйста: есть функция объединенная фигурной скобкой ...

Одновременное построение нескольких графиков
Здравствуйте! Нужна помощь в построении графиков. 4 графика, строятся они поотдельности верно, но...

Chart: построение графиков нескольких функций
С использованием компонента Chart построить графики трех прямых каждого типа в соответствии с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru