如何在图中找到选择特定数字的条件 - matlab

时间:2017-09-12 17:53:54

标签: matlab

Xvalue versus b
 我想要一个函数,每次我改变g时,我的选择点的值是数据图。我怎么能这样做?

function help = b0calc



s=0.319;
R= [0.319/0.6] ;
bb1 = linspace(0.01,10,600);
gg=0.5;  % gg = g for many values of g 


f2 = @(r,b,g) 1./(r.^2.*sqrt(1 - (b./r).^2 - (g^-2)*((2/15)*(s/R)^9 *(1./(r - 1).^9 - 1./(r + 1).^9 - 9./(8* r).*(1./(r - 1).^8 - 1./(r + 1).^8)) - (s/(R))^3 *(1./(r -1).^3 - 1./(r + 1).^3 - 3./(2* r).* (1./(r - 1).^2 - 1./(r + 1).^2)))));

X_scalar_b_scalar_g = @(b,g)real(pi - 2*b*quadgk(@(r)f2(r,b,g),rmin(g,b,R),Inf,'AbsTol',1e-4,'RelTol',1e-4,'MaxIntervalCount',5000));



 for j=1:length(bb1)
 Xg(j)=X_scalar_b_scalar_g(bb1(j),gg);
 end
 figure(1);
 plot(bb1,Xg)


end

 function r = rmin(g,b,R)
    s=0.319;

    f1 =  @(r)  1 - (b./r).^2 - (g^-2)*((2/15)*(s/R)^9 *(1./(r - 1).^9 - 1./(r + 1).^9 - 9./(8*r).*(1./(r - 1).^8 - 1./(r + 1).^8)) -(s/R)^3 *(1./(r-1).^3 - 1./(r+1).^3 - 3./(2*r).*(1./(r-1).^2 - 1./(r+1).^2)));
    r = fzero(f1,[1.0000001,9999999999999999999999999999999999999999999]);
 end

对于gg = g的每次更改,图形在y坐标中都有一个奇点...我想要每次都给出这个奇点的x值。

1 个答案:

答案 0 :(得分:1)

您可以使用一阶导数中的符号更改来跟踪它

 function [sng_pos, sng_val, dydx] = first_derivative(x,y)
    % First derivative - first order forward difference
    h = x(2)-x(1);      
    dydx = diff(y)/h;
    % Find sign change then lowest function value in that range
    ing = find(dydx <= 0);
    sng_ind = find(y==min(y(max(ing)),y(max(ing)+1)));
    sng_pos = x(sng_ind);
    sng_val = y(sng_ind);
 end

这假设奇点存在于第一个最小值 - 全局或局部。它将奇点视为具有相反符号的两个导数值之间的最低函数值。

请注意,这使用了一阶前向差分方案 - 使用更高阶方案和精细网格可以获得更好的结果。二阶中心方案可能已经显着优越。

主要功能的用法示例:

 [s_pos, s_val, dydx] = first_derivative(bb1,Xg);

 fprintf('Position of singularity: %f and value: %f \n', s_pos, s_val)

 figure(2)
 plot(bb1(1:end-1), dydx)
 title('First derivative')