试图求解下式(eqn(中的p,Matlab需要很长时间才能求解,因此我不确定如何优化,也不确定是否存在更好的求解函数。它可以很容易地绘制它,仅仅求解p的任何值似乎都是不可能的。
A_1 = 0.1044;
R_1 = 84.0038;
A_2 = 0.02667;
R_2 = 118.4852;
h_max_2 = 1.889;
q_s = 0.08;
a = 1/(A_2*R_2);
b = 1/(A_1*R_1);
c = 1/(A_1*A_2*R_1);
syms p
eqn = h_max_2 == q_s*c*1/(a*b)*(1+1/(a-b)*(b*exp(-a*p)-a*exp(-b*p)));
time_until = solve(eqn_2,p)
把h_max_2
移到另一边,然后找到方程何时为零怎么样?这可以通过对fzero
的简单调用来解决。
eqn = @(p) q_s*c*1/(a*b)*(1+1/(a-b)*(b*exp(-a*p)-a*exp(-b*p))) - h_max_2;
time_until = fzero(eqn, 0)
time_until = -2.7137
或者,如果您想要一个具有正p
的解决方案,请尝试使用初始猜测,例如p0 = 10
。
time_until = fzero(eqn, 10)
time_until = 4.4923
eqn(time_until)
ans = 0
查看代码的最后一行,没有eqn_2
变量,所以我假设它应该是eqn
。否则,如果您的工作空间中确实有一个eqn_2
,那么您可能正在尝试解决一个非常不同的函数。
你使用的是什么版本的MATLAB?您的代码在R2021a上为我执行的时间不到0.1秒。它确实给出了消息Warning: Unable to solve symbolically. Returning a numeric solution using vpasolve.
,因此您的最后一行可能应该修改为:time_until = vpasolve(eqn,p);
。如果你的MATLAB版本没有自动跳转到vpasolve
,这可能解释了你所看到的。
对于更复杂的函数,在求解之前,在方程上使用simplify
可能会得到更快的结果,但在这种情况下,我没有时差,因为它已经很快了。
@stewie-griffin的解决方案是,当函数为零时,重新排列以求解,这可能是一种更好、更快的方法,但我想尝试用你尝试的方法来解决这些问题。