如何通过fsolve求解具有两个元素的非线性方程?

时间:2015-04-10 09:36:39

标签: matlab optimization

我有一个函数,它有一些常量的输入参数。但是,我还必须计算两个Hwteta元素。事实上,我有一个方程式,有两个unkonwns。

输入参数:

D=0.030; 
A=7.0685*10^-4; 
Jo=0.763; 
Jw=0.778090833; 
ro_o=910; ro_w=1000; 
mu_w=0.001; 
mu_o=0.92;
需要从迭代过程计算

teta

(-2*pi*Hw)+teta-sin(teta)==0

在计算teta[0 2*pi]中的初始猜测)之后,我们必须将其放在以下等式中以求解Hw,但问题是teta本身就是也是Hw的函数。

[Hw, fValue] = fsolve(@(Hw) (((8*ro_o*((D-(2*sqrt(Hw*A/pi)))*(Jo/(1-Hw))*ro_o/mu_o)^-1.0)*(((Jo/(1-Hw))-(Jw/Hw))*((Jo/(1-Hw))-(Jw/Hw))))*(pi*D/2*(2*sin(teta/2)+2*pi-teta)*(1/(1-Hw))))-((0.023*(((Jw*D*ro_w)/mu_w)^-.2)*ro_w*(Jw/Hw)^2*(pi*D))), 0.9);

如果有人能帮助我,我将不胜感激。

1 个答案:

答案 0 :(得分:0)

一种方法是同时求解两个方程的根。 fsolve允许这一点。

您需要将两个标量方程转换为单个向量方程:

D = 0.030; 
A = 7.0685e-4; 
Jo = 0.763; 
Jw = 0.778090833; 
ro_o = 910;
ro_w = 1000; 
mu_w = 0.001; 
mu_o = 0.92;

f = @(x)[-2*pi*x(2)+x(1)-sin(x(1));
         (8*ro_o*((D-2*sqrt(x(2)*A/pi))*(Jo/(1-x(2)))*ro_o/mu_o)^-1)* ...
         (Jo/(1-x(2))-Jw/x(2))^2*pi*D/2*(2*sin(x(1)/2)+ ...
         2*pi-x(1))/(1-x(2))-0.023*(Jw*D*ro_w/mu_w)^-0.2* ...
         ro_w*(Jw/x(2))^2*pi*D];
x0 = [pi;0.9];
[x, fValue] = fsolve(f, x0)
teta = x(1);
Hw = x(2);

,对于所选择的初始猜测,返回

x =

   3.182192078148883
   0.512921423233560

选择其他初步猜测(例如x0 = [0;0.9];x0 = [2*pi;0.9];)将返回不同的解决方案。

您可能会注意到我在您的问题中从匿名函数中删除了一堆多余的括号 - 实际上大约有30个!不需要的括号会使阅读代码变得更加困难,并且不能替代熟悉Matlab中的operator precedence。我还简化了一些术语。你应该检查它是否仍然正确。

对于长复杂的方程,使用匿名函数也是一个坏习惯。这些很难阅读和调试,它们的效率低于常规功能。您应该将上面的匿名函数f转换为常规函数,这样您就可以将长篇内容转化为有意义的术语。然后将句柄传递给fsolve这个新函数。如果要将参数传递给此新函数,请参阅The MathWorks上的this article参数化函数。我也认为你可能拼错了希腊变量名“theta”,也可能是“rho”。