试图找到两个函数相互不同的点,使用Matlab得出5%

时间:2014-07-25 16:08:02

标签: matlab function intersection

正如我在标题中所写的那样,当两个函数开始彼此相差5个Y轴时,我试图找到确切的距离(在这种情况下是无量纲距离)。这两个函数在X轴上以1的值相交,我需要在交点之前找到所描述的距离,而不是之后(即,它必须小于1)。我已经为您编写了一个Matlab代码,以便查看函数的形状以及我尝试使它们工作的以下计算但是他们不知道,我不知道为什么。 "无法找到明确的解决方案"。

我不知道我是否清楚地解释了它。如果您需要更详细的解释,请告诉我。

我希望你能在这个问题上有所启发。

非常感谢你。

r=0:0.001:1.2;
ro=0.335;
rt=r./ro;
De=0.3534;
k=2.8552;
B=(2*k/De)^0.5;
Fm=2.*De.*B.*ro.*[1-exp(B.*ro.*(1-rt))].*exp(B.*ro.*(1-rt));
A=5;
b=2.2347;
C=167.4692;
Ftt=(C.*(exp(-b.*rt).*((b.^6.*rt.^5)./120 + (b.^5.*rt.^4)./24 + (b.^4.*rt.^3)./6 +         (b.^3.*rt.^2)./2 + b.^2.*rt + b) - b.*exp(-b.*rt).*((b.^6.*rt.^6)./720 + (b.^5.*rt.^5)./120 + (b.^4.*rt.^4)./24 + (b.^3.*rt.^3)./6 + (b.^2.*rt.^2)./2 + b.*rt + 1)))./rt.^6 - (6.*C.*(exp(-b.*rt).*((b.^6.*rt.^6)./720 + (b.^5.*rt.^5)./120 + (b.^4.*rt.^4)./24 + (b.^3.*rt.^3)./6 + (b.^2.*rt.^2)./2 + b.*rt + 1) - 1))./rt.^7 - A.*b.*exp(-b.*rt);
plot(rt,-Fm,'red')
axis([0 2 -1 3])
xlabel('Dimensionless distance')
ylabel('Force, -dU/dr')
hold on
plot(rt,-Ftt,'green')
clear rt
syms rt
%assume(0<rt<1)
r1=solve((Fm-Ftt)/Ftt==0.05,rt)
r2=solve((Ftt-Fm)/Fm==0.05,rt)

1 个答案:

答案 0 :(得分:2)

欢迎来到浮点数据的关键。原因是因为对于您提供的r的值,0.05的确切解决方案可能介于 r中的两个值之间数组,因此您无法获得完全解决方案。此外,FWIW,您的等式可能从不生成0.05的解决方案,这也是您获得该错误的原因。无论哪种方式,都不建议对浮点数据进行明确的解决,除非您非常清楚数据的形状以及您对将数据应用于函数的输出所期望的值。

因此,始终建议您找到满足您条件的最近值。因此,你应该这样做:

[~,ind] = min(abs((Fm-Ftt)./Ftt - 0.05)); 
r1 = r(ind);

第一行将在r数组中找到满足5%标准的最近位置。然后,下一行代码将为您提供满足此要求的r数组中的值。您可以使用r2执行相同的操作:

[~,ind2] = min(abs((Ftt-Fm)./Fm - 0.05)); 
r2 = r(ind2);

上面代码基本上做的是它试图找到你的数组中你的数据和5%之间的差异为0的位置。换句话说,你的r数组中的哪一点会足够近以使上述关系等于0,或基本上当它尽可能接近5%时。

如果您想改进这一点,您可以随时更改r的步长...或者将其设为0.00001或其他内容。但是,步长越小,阵列越大,你最终会耗尽内存!