Matlab:提取我绘制但尚未存储的值

时间:2017-02-28 15:31:46

标签: matlab plot matlab-figure

我有一个数学函数 E 我想最小化。我解决了这16个可能的解决方案 x1,x2,...,x16 ,其中只有两个实际上最小化了函数(位于最小值)。使用for循环,然后我可以将所有这16个解决方案插入到原始函数中,并通过if语句应用一些条件来选择我需要的解决方案(绘制 E vs E(x)如果 x 是实数和正数,如果 E 的一阶导数低于阈值,并且 x 的二阶导数< em> E 是积极的。)

这样我只会绘制我感兴趣的解决方案。但是,我现在想要提取我绘制的相关 x 。这是一个示例MATLAB代码,它描绘了我刚才描述的方式。我想提取我实际上最终绘制的那些。怎么做?

format long
theta_s = 0.77944100;
sigma = 0.50659500;
Delta = 0.52687700;

%% Defining the coefficients of the 4th degree polynomial
alpha = cos(2*theta_s);
beta = sin(2*theta_s);
gamma = 2*Delta^2/sigma^2;
a = -gamma^2 - beta^2*Delta^2 - alpha^2*Delta^2 + 2*alpha*Delta*gamma;
b = 2*alpha*gamma - 2*Delta*gamma - 2*alpha^2*Delta + 2*alpha*Delta^2 -...
    2*beta^2*Delta;
c = 2*gamma^2 - 2*alpha*Delta*gamma - 2*gamma - alpha^2 + 4*alpha*Delta +...
    beta^2*Delta^2 - beta^2 - Delta^2;
d = -2*alpha*gamma + 2*Delta*gamma + 2*alpha + 2*beta^2*Delta - 2*Delta;
e = beta^2 - gamma^2 + 2*gamma - 1;

%% Solve the polynomial numerically.
P = [a b c d e];
R = roots(P);

%% Solve r = cos(2x) for x: x = n*pi +- 1/2 * acos(r). Using n = 0 and 1.
theta   = [1/2.*acos(R) -1/2.*acos(R) pi+1/2.*acos(R) pi-1/2.*acos(R)];
figure;
hold on;
x = 0:1/1000:2*pi;
y_1 = sigma*cos(x - theta_s) + sqrt(1 + Delta*cos(2*x));
y_2 = sigma*cos(x - theta_s) - sqrt(1 + Delta*cos(2*x));
plot(x,y_1,'black');
plot(x,y_2,'black');
grid on;

%% Plot theta if real, if positive, if 1st derivative is ~zero, and if 2nd derivative is positive
for j=1:numel(theta);
    A = isreal(theta(j));
    x_j = theta(j);
    y_j = sigma*cos(x_j - theta_s) + sqrt(1 + Delta*cos(2*x_j));
    FirstDer = sigma* sin(theta(j) - theta_s) + Delta*sin(2*theta(j))/...
        sqrt(1 + Delta*cos(2*theta(j)));
    SecDer = -sigma*cos(theta(j)-theta_s) - 2*Delta*cos(2*theta(j))/...
        (1 + Delta*cos(2*theta(j)))^(1/2) - Delta^2 * (sin(2*theta(j)))^2/...
        (1 + Delta*cos(2*theta(j)))^(3/2);
    if  A == 1 && x_j>=0 && FirstDer < 1E-7 && SecDer > 0
        plot(x_j,y_j,['o','blue'])
    end
end

2 个答案:

答案 0 :(得分:1)

完成所有绘图后,获取轴处理:

ax = gca;

然后写:

X = get(ax.Children,{'XData'});

X将是图中所有行的所有x轴值的单元格数组。每行一个单元格。

对于上面的代码:

X = 
    [1.961054062875753]
    [4.514533853417446]
    [1x6284 double]
    [1x6284 double]

答案 1 :(得分:1)

(首先,代码全部有效。感谢那里的努力。)

这里有选择。一对夫妇在

之下

在生成值时记录值

在“成功”if语句中,只需记录值即可。请参阅下面的代码编辑。

这对我来说永远是首选,它看起来效率更高。

xyResults = zeros(0,2);  %%% INITIALIZE HERE
for j=1:numel(theta);
    A = isreal(theta(j));
    x_j = theta(j);
    y_j = sigma*cos(x_j - theta_s) + sqrt(1 + Delta*cos(2*x_j));
    FirstDer = sigma* sin(theta(j) - theta_s) + Delta*sin(2*theta(j))/...
        sqrt(1 + Delta*cos(2*theta(j)));
    SecDer = -sigma*cos(theta(j)-theta_s) - 2*Delta*cos(2*theta(j))/...
        (1 + Delta*cos(2*theta(j)))^(1/2) - Delta^2 * (sin(2*theta(j)))^2/...
        (1 + Delta*cos(2*theta(j)))^(3/2);
    if  A == 1 && x_j>=0 && FirstDer < 1E-7 && SecDer > 0
        xyResults(end+1,:) = [x_j  y_j];  %%%% RECORD HERE
        plot(x_j,y_j,['o','blue'])
    end
end

从图形对象中获取结果

您可以从实际图形对象中获取所需的数据。如果在生成数据时无法捕获数据,那么这将是一个选项。

%First find the objects witht the data you want
%     (Ideally you could record handles to the lines as you generated
%      them above. But then you could also simply record the answer, so
%      let's assume that direct record is not possible.)
%     (BTW, 'findobj' is an underused, powerful function.)
h = findobj(0,'Marker','o','Color','b','type','line')

%Then get the `xdata` filed from each
capturedXdata = get(h,'XData');
capturedXdata =
  2×1 cell array
    [1.96105406287575]
    [4.51453385341745]

%Then get the `ydata` filed from each
capturedYdata = get(h,'YData');
capturedYdata =
  2×1 cell array
    [1.96105406287575]
    [4.51453385341745]