我想要一个函数,每次我改变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值。
答案 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')