在尝试求解下面的方程(方程n)中的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)
2条答案
按热度按时间nwsw7zdq1#
把
h_max_2
移到另一边,找出方程什么时候是零,怎么样?这可以通过简单地调用fzero
来解决。或者,如果您想要具有正
p
的解决方案,请尝试使用初始猜测,例如p0 = 10
。idv4meu82#
看一下代码的最后一行,没有
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提出的解决方案(当函数为零时重新安排求解)可能是一种更好、更快的方法,但我想尝试用您尝试过的方法来解决这些问题。