【问题标题】:Intersection of line and curve Matlab直线与曲线的交点 Matlab
【发布时间】:2015-11-29 20:11:30
【问题描述】:

最近又出现了另一个问题。 我有一组代表一条曲线和一条我用 line() 函数绘制的线。 到目前为止,我的代码是:

clc, clear all, close all;

n = 800/1500;
I = [ 0 1.1 4 9.5 15.3 19.5 23.1 26 28.2 30.8 33.3 35.9];
E_up = [ 5.8 10.5 28 60.3 85.5 100.3 108 113.2 117 120.5 123.5 126];
E_up = E_up./n;
Iw = [ 34 31.5 28.2 23.9 19.9 16.1 13 8.1 3.5 1.2 0 NaN];
E_down = [124.6 122.5 118.8 112.2 103.9 93.1 81.6 59.1 29.6 14.5 9.5 NaN];
E_down = E_down./n;


x_est = I;
y_est = spline(Iw,E_down,x_est)
A(:,1)= E_up
A(:,2) = y_est

ma = mean(A,2)

% figure()
% hold all
% % plot(x_est,y_est,'ro')
% plot(I,E_up,'b-',Iw,E_down,'g-')
% plot(I,ma,'r')
% grid on
% legend('up','down','mean')

%dane_znamionowe

clc, clear all, close all;

%data_entry
n = 800/1500;
I = [ 0 1.1 4 9.5 15.3 19.5 23.1 26 28.2 30.8 33.3 35.9];
E_up = [ 5.8 10.5 28 60.3 85.5 100.3 108 113.2 117 120.5 123.5 126];
E_up = E_up./n; %rescalling_EMF
Iw = [ 34 31.5 28.2 23.9 19.9 16.1 13 8.1 3.5 1.2 0 NaN];
E_down = [124.6 122.5 118.8 112.2 103.9 93.1 81.6 59.1 29.6 14.5 9.5 NaN];
E_down = E_down./n; %rescalling_EMF
Un = 220;
In = 28.8;
wn = 1500;
wmax = 3000;
P = 5.5e3;
Rs = 15.8/25;

%interpolation
x_est = I;
y_est = spline(Iw,E_down,x_est);

%mean_values
A(:,1)= E_up;
A(:,2) = y_est;
ma = mean(A,2);

%party_Xd
figure()
[ax,h1,h2] = plotyy(I+30,wn,I,ma,'plot','plot');
set(ax(1),'ylim',[0 3000],'ytick',[1500  3000]);
set(ax(2),'ylim',[0 300],'ytick',[100 200 300]);
hold(ax(1))
hold(ax(2))

%stable_parts
set(ax,'NextPlot','add')
plot(ax(2),I,ma,'b')
plot(ax(2),0,Un,'m*')
i2 = 0:0.01:70;
plot(ax(2),i2,Un-(i2*Rs),'m--')
iin = 0:1:300;
plot(ax(2),In,iin,'g-')
plot(ax(1),i2,wn,'k-','linewidth',8)
plot(ax(1),28.8,1500,'g*')

%loop
p1x = [35 45 55 65];

for ii = 1 :length(p1x)
    x11 = p1x(ii);
    y11 = 0;
    x21 = In;
    y21 = wn;
    x1 = [35 45 55 65];
    y1 = [0 0 0 0];
    x2 = [In In In In];
    y2 = [wn wn wn wn];
    slope = (y21-y11)/(x21-x11);
    xLeft = 0; 
    yLeft = slope * (xLeft - x11) + y11;
    xRight = 70; 
    yRight = slope * (xRight - x11) + y11;
    plot(ax(2),x11,0,'r.')
    a1 = line([xLeft, xRight], [yLeft, yRight], 'Color', 'c');

    x0 = (max(min(x1),min(x2))+min(max(x1),max(x2)))/2;
    fun1 = @(x) interp1(x1,y1,x,'linear');
    fun2 = @(x) interp1(x2,y2,x,'linear');
    difffun = @(x) fun1(x)-fun2(x);
    crossing = fzero(difffun,x0); %crossing x coordinate
    crossval = fun1(crossing);
end

我的图表看起来像这样,相当不错。但是我需要找到青色线和蓝色曲线的交点。

【问题讨论】:

  • 请只贴相关代码,其他三行的代码没人看。
  • 我建议查看my answer 另一个问题,这并没有解决那个问题,但我相信它会解决你的问题:)
  • @AndrasDeak 交叉输出中的问题是它只给出 x 坐标,而我需要 x,y。如果你能在那时编写我的代码,我会非常高兴。还是谢谢你。
  • 你只需要替换成任何一个插值函数。反正我加了一个答案。

标签: matlab intersection


【解决方案1】:

基于my solution to a similar question的答案:

%dummy input
x1=[0 1 2 3]; 
y1=[1 4 2 0];
x2=[-1 3 4 5];
y2=[-1 2 5 3];

x0 = (max(min(x1),min(x2))+min(max(x1),max(x2)))/2;
fun1 = @(x) interp1(x1,y1,x,'linear','extrap');
fun2 = @(x) interp1(x2,y2,x,'linear','extrap');
difffun = @(x) fun1(x)-fun2(x);

crossing = fzero(difffun,x0); %crossing x coordinate
crossval = fun1(crossing); %substitute either function at crossing point

plot(x1,y1,'b-',x2,y2,'r-',crossing,crossval,'ks');
legend('line1','line2','crossover','location','nw');

之后,[crossing, crossval] 会给出你的交叉点。

结果:

【讨论】:

  • 我已经添加了您发布的代码部分,我收到一个错误,即插值需要每个维度中至少两个样本点。
  • p1x = [35 45 55 65]; for ii = 1 :length(p1x) x1 = p1x(ii); y1 = 0; x2 = In; y2 = wn; slope = (y2-y1)/(x2-x1); xLeft = 0; yLeft = slope * (xLeft - x1) + y1; xRight = 70; yRight = slope * (xRight - x1) + y1; plot(ax(2),x1,0,'r.') a1 = line([xLeft, xRight], [yLeft, yRight], 'Color', 'c'); x0 = (max(min(x1),min(x2))+min(max(x1),max(x2)))/2; fun1 = @(x) interp1(x1,y1,x,'linear'); fun2 = @(x) interp1(x2,y2,x,'linear'); difffun = @(x) fun1(x)-fun2(x); crossing = fzero(difffun,x0); crossval = fun1(crossing); end
  • @sayidjetzenden 你需要定义vectors x1, y1, x2, y2。在您的评论中,每个都有一个值。但是您不必重新定义这些:只需使用用于绘制这些线的相同变量......
  • ` x1 = [35 45 55 65]; y1 = [0 0 0 0]; x2 = [输入输入输入]; y2 = [wn wn wn wn];` 我试过这个,我得到了同样的错误。
  • @sayidjetzenden 请忘记使用答案中的代码而不注明出处的习惯。我建议在您的问题中添加“更新”部分,最好附上说明您也在使用我的解决方案的说明。但最后,Stack Overflow 更喜欢答案是否只是实际答案,因此无需编辑问题以包含有效答案。也就是说,我知道我们还没有解决您的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多