2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 График кусочной функции в MATLAB.
Сообщение24.11.2017, 13:06 


10/06/13
101
Как построить график функции в матлабе( например, для n=3).В фигурных скобках - дробная часть числа. $$    T_{n}:[0,1]\to[0,1]$$
$$T_{n}(x)=\begin{cases}
\left\lbrace nx\right\rbrace,&\text{если $x\ne 1$;}\\
1,&\text{если $x=1$;}\\

\end{cases}$$

Пробовал сам построить, но ничего хорошего не получилось:
Код:
x=0:0.02:1;
y=(3*x-fix(3*x)).*(x~=1) + (1)*(x=1);
plot(x, y),   grid

 Профиль  
                  
 
 Posted automatically
Сообщение24.11.2017, 13:12 
Заслуженный участник


09/05/12
25179
 i  Тема перемещена из форума «Околонаучный софт» в форум «Карантин»
по следующим причинам:

- отсутствуют собственные содержательные попытки решения задачи.

Исправьте все Ваши ошибки и сообщите об этом в теме Сообщение в карантине исправлено.
Настоятельно рекомендуется ознакомиться с темами Что такое карантин и что нужно делать, чтобы там оказаться и Правила научного форума.

 Профиль  
                  
 
 Posted automatically
Сообщение24.11.2017, 23:28 
Заслуженный участник


09/05/12
25179
 i  Тема перемещена из форума «Карантин» в форум «Околонаучный софт»

 Профиль  
                  
 
 Re: График кусочной функции в MATLAB.
Сообщение25.11.2017, 00:17 
Заслуженный участник


05/08/14
1564
Создайте матлаб--функцию, или файл - функцию, подайте ей на вход массив х, получите на выходе массив у, далее plot.

 Профиль  
                  
 
 Re: График кусочной функции в MATLAB.
Сообщение25.11.2017, 01:53 


07/10/15

2400
У Вас ошибка в 3 строке, в логическом выражении нужно писать "==" а не "=", т.е. нужно вот так:
(ось x советую продлить до 2, чтобы было видно точку x=1)
Используется синтаксис Matlab M
x=0:0.02:2;
y=(3*x-fix(3*x)).*(x~=1) + (1)*(x==1);
plot(x, y),   grid;
 

 Профиль  
                  
 
 Re: График кусочной функции в MATLAB.
Сообщение25.11.2017, 14:41 


10/06/13
101
Мне бы хотелось получить такой график, причем с выколотыми и закрашенными точками:

Изображение

а МАТЛАБ мне выдает такое:
Код:
x=0:0.02:2;
y=(3*x-fix(3*x)).*(x~=1) + (1)*(x==1);
plot(x, y),   grid;


Изображение

как решить эту проблему?

 Профиль  
                  
 
 Re: График кусочной функции в MATLAB.
Сообщение25.11.2017, 14:46 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
А Матлаб просто так, без доп. усилий вообще умеет рисовать графики с выколотыми и закрашенными точками и без вот этих вертикальных линий? Думаю, здесь нужно как следует постараться.

 Профиль  
                  
 
 Re: График кусочной функции в MATLAB.
Сообщение25.11.2017, 14:52 


10/06/13
101
К сожалению, не сумел найти хотя бы примера как это реализовать, а у Вас есть идеи?

 Профиль  
                  
 
 Re: График кусочной функции в MATLAB.
Сообщение25.11.2017, 15:01 
Заслуженный участник


09/05/12
25179
Практически все "графикорисовалки" просто соединяют точки линиями, отсюда и результат. То, что Вы хотите, можно сделать, если рисовать каждый участок как отдельный график, а потом также отдельно расставить выделенные точки.

 Профиль  
                  
 
 Re: График кусочной функции в MATLAB.
Сообщение25.11.2017, 15:18 


07/10/15

2400
Запросто, рисуем линию по точкам без их соединения (шаг сетки увеличиваем в 100 раз, чтобы точки слились в сплошные линии),
находим точки разрыва по условию $y_n-y_{n+1}>0.8$ и наносим эти точки поверх предыдущего графика в виде кружочков, ну или как Вам больше нравится, вот рабочий пример:
Используется синтаксис Matlab M
x=0:0.0002:2;
y=(3*x-fix(3*x)).*(x~=1) + (1)*(x==1);
index=find(y(1:end-1)-y(2:end)>0.8);

figure; plot(x, y,'.','markersize',1);
hold on
plot(x(index), y(index),'o','markersize',8,'color','red','markerfacecolor','red'),
plot(x(index+1), y(index+1),'o','markersize',8,'color','red','markerfacecolor','red'),   grid;
hold off
 

 Профиль  
                  
 
 Re: График кусочной функции в MATLAB.
Сообщение25.11.2017, 15:22 


10/06/13
101
Andrey_Kireew, спасибо.

 Профиль  
                  
 
 Re: График кусочной функции в MATLAB.
Сообщение25.11.2017, 20:36 
Аватара пользователя


11/06/12
10390
стихия.вздох.мюсли
Pphantom в сообщении #1268944 писал(а):
Практически все "графикорисовалки" просто соединяют точки линиями, отсюда и результат.
Математика с некоторых пор умеет более красиво, даже на автомате. Есть ещё и опции (Exclusions, ExclusionsStyle), помогающие это контролировать.

 Профиль  
                  
 
 Re: График кусочной функции в MATLAB.
Сообщение26.11.2017, 00:23 
Заслуженный участник
Аватара пользователя


01/09/13
4676
Помнится, достаточно NaN вставить в точку разрыва....

 Профиль  
                  
 
 Re: График кусочной функции в MATLAB.
Сообщение26.11.2017, 03:19 
Заслуженный участник


12/07/07
4529
Matlab R2013b MuPAD Notebook
Вложение:
Matlab2013bPWPlot.png
Matlab2013bPWPlot.png [ 68.46 Кб | Просмотров: 0 ]


-- Вс 26.11.2017 02:34:02 --

By default, the attribute DiscontinuitySearch = TRUE is set. This triggers a semi-symbolic preprocessing of the expression f to search for discontinuities and singularities. At each singular point, the function graph is split into disjoint branches to the left and to the right of the singularity. This avoids graphical artifacts such as lines connecting points to the left and to the right of a singularity.

 Профиль  
                  
 
 оси с разным масштабом в МАТЛАБ
Сообщение05.12.2017, 02:40 


10/06/13
101
Можно ли добиться того, чтобы график на выходе получился приплюснутым по оси Х, т.е. масштаб осей был разным?
(внизу м-функция для построения графиков дробной части)

Код:
function TTT
n=2;
flag=0;

if flag==1

color=[0 0.5 0.5];
rectangle('Position',[0 0 0.5 1],'FaceColor',...
    color,'EdgeColor',color)
rectangle('Position',[0.75 0 0.25 1],'FaceColor',...
    color,'EdgeColor',color)
end

box on
ax = gca;
ax.DataAspectRatio=[1 1 1];
ax.XTick=[0:0.2:1];
ax.YTick=[0:0.2:1];


xlabel(['Т_' num2str(n) '(x)'])

k=0;
for i=1:n
   
    x1=k;
    x2=1/n+k;
    x=linspace(x1,x2);
    y=linspace(0,1);
   
    hold on
    plot(x,y,'b','LineWidth',1.5) 
   
    plot(x1,0,'.r','MarkerSize',28)
    if i~=n
    plot(x2,1,'og','MarkerSize',8)
    else
    plot(x2,1,'.r','MarkerSize',28)
    end
    k=k+1/n;

end

end

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 17 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group