Как построить квадратичную функцию в Matlab (с осями разного масштаба)

Я пытаюсь построить график корневой функции с двумя осями разного масштаба, поэтому, скажем, ось x идет от 0 до 1,2 с шагом 0,1, а ось y идет от 0 до 1,4 с шагом 0,2 (одна функция, 2 оси разного масштаба). Я думаю, что правильно масштабировал, пожалуйста, поправьте меня, если есть лучший способ запрограммировать это.

Вот мой код:

x = linspace(0,1.2);
y = 0.5 + (0.9 * (x.^2 - 0.0432)).^(1/2);

% here I need the negative part as well: 0.5 - [...] as follows:
% y2 = 0.5 - (0.9 * (x.^2 - 0.0432)).^(1/2); 
% How can I create this function and plot it?

plot(x,y)
axis([0 1.2 0 1.4])
set(gca,'xTick',0:0.1:1.2)
set(gca,'yTick',0:0.2:1.4)

grid on

У меня есть верхняя часть функции, но не нижняя (отрицательная, см. комментарий выше в коде). Как его можно создать? Или, если это невозможно, как я могу создать график из по-разному определенных «подграфов»? Домен каким-то образом нужно ограничить x >= 0.206.


person user3032689    schedule 09.12.2015    source источник
comment
Прочтите документацию по функциям, которые вы пытаетесь использовать. Для начала plot принимает несколько рядов входных данных (например, plot(x, y, x, y2);). В документации также есть ссылка на hold, который сохраняет графики в текущем оси, чтобы новые графики, добавленные к осям, не удаляли существующие графики   -  person excaza    schedule 09.12.2015
comment
Интересная часть здесь заключается в том, что вы на самом деле хотите построить. Обратите внимание, что эта функция не принадлежит действительным числам для данного диапазона. Числа между [0,206) чисто мнимые. Итак, если вы хотите построить это в 2D, вы получите что-то вроде этого. Если этого недостаточно, существуют разные способы представления комплексных чисел. Вам нужно будет указать, как вы хотите это сделать.   -  person patrik    schedule 09.12.2015
comment
Вы не смогли найти функцию для получения компонента real сложного количество?   -  person excaza    schedule 09.12.2015
comment
0,0432 недостаточно реального диапазона [0,206,inf) (немного). И ограничение домена функции — это то, что вы делаете сами. Теперь вы устанавливаете домен на [0,1.2]. Функция, требующая дескриптора функции, может установить для домена все возможные значения и т. д. Для этого нет общего правила, и, поскольку Matlab работает численно (в основном), этот вид устанавливает условия. Далее вопрос не очень ясен. Что означают 2 оси с разным масштабом? 2 функции - 2 оси Y, 1 функция - 2 оси Y, 1 функция, где ось X и ось Y имеют разное масштабирование? Или вы просто хотите спросить, правильный ли ваш код?   -  person patrik    schedule 09.12.2015
comment
@patrik Извините, я имел в виду 1 функцию, в которой оси X и Y имеют разное масштабирование. Также я хотел сказать x >= 0.206 вместо x >= 0.0432. Я хотел бы построить параболу для этой области. Приведенный выше код неполный, так как в нем отсутствует нижняя (отрицательная) часть функции.   -  person user3032689    schedule 09.12.2015
comment
Тогда я предполагаю, что ваш код делает то, что вы хотите. Если вы узнаете, в какой момент функция становится сложной, вы, вероятно, сможете построить область, в которой функция действительна. Я не уверен, как я могу помочь. Как уже говорилось, функция не очень понятна, и создается впечатление, что вы хотите, чтобы мы подтвердили вашу попытку. Пожалуйста, отредактируйте сообщение, указав четко сформулированный вопрос.   -  person patrik    schedule 09.12.2015
comment
Я попытался объяснить, чего я пытаюсь достичь. Я до сих пор не знаю, как правильно построить полную корневую функцию для домена x >= 0.0432. Мой код этого не делает, вы его когда-нибудь запускали?   -  person user3032689    schedule 09.12.2015
comment
Да, я сначала работал с инверсией. Неправильный термин, мой плохой. Отредактировано в исходном сообщении.   -  person user3032689    schedule 09.12.2015
comment
Боюсь, sqrt(f(x)), f(x) = a*x^2+b*x+c не даст вам параболу. попробуйте построить диапазон [-10,10] и посмотрите, как он выглядит. Значения между (-0,206,0,206) будут повреждены из-за ранее указанной проблемы. В противном случае функция будет действовать достаточно линейно. И да, ваш пример работает на моей машине.   -  person patrik    schedule 09.12.2015
comment
Давайте продолжим обсуждение в чате.   -  person patrik    schedule 09.12.2015


Ответы (1)


Вы близко! Я бы сделал следующее. См. комментарии в коде ниже:

n = 1000;                % number of points. More points, smoother 
                         % looking piecewise linear approx. of curve

x0 = sqrt(.0432)+eps;    % Choose smallest xvalue to be at or epsilon to the right
                         % of the apex of the parabola

x = linspace(x0, 1.2, n)';   %'  transpose so x is a column vector (more convenient)
y_pos = 0.5 + (0.9 * (x.^2 - 0.0432)).^(1/2); % positive branch of parabola
y_neg = 0.5 - (0.9 * (x.^2 - 0.0432)).^(1/2); % negative branch of parabola

plot(x,[y_pos, y_neg],'blue')  % we´re graphing two series but use 'blue'
                               % for both so it looks like one series!
axis([0 1.2 0 1.4])
set(gca,'xTick',0:0.1:1.2)
set(gca,'yTick',0:0.2:1.4)

grid on
person Matthew Gunn    schedule 09.12.2015
comment
Исправлена ​​опечатка. Я собирался использовать больше баллов (n=1000), но моя первая публикация не прошла n в linspace. - person Matthew Gunn; 09.12.2015
comment
Отредактировано для лучшей подсветки кода. (один ' делает все, что следует за ним, окрашенным в одну строку) - person thewaywewalk; 10.12.2015