2014-12-09 122 views
-1

发现我已经方程式迭代在Matlab

(250-25)/((0.0106+1.89799*10^-3)+(log(x/15)/2*3.14*45)+(1/10*2*3.14*x))... 
    ==157.19; 

我试图找到x的值,使右侧等于左侧以下(X)的值。

到目前为止,我已经尝试过,没有任何运气

syms x 
eqn=(250-25)/((0.0106+1.89799*10^-3)+(log(x/15)/2*3.14*45)+(1/10*2*3.14*x))... 
    ==157.19; 
solve(eqn,x) 

以下,其结果是

ans = 

(225*lambertw(0, (2*exp(8035698630091128826615/400116850530983344078848))/15))/2 
+1

如果您将解决方案从上面的链接应用到'ans',您会得到'13.5658'。 – Schorsch 2014-12-09 12:04:40

+0

这里没有问题。编辑以添加特定问题。 – horchler 2014-12-09 17:15:57

回答

2

尝试用数值方法来代替。无论如何,你并没有使用有理数,所以即使你的符号解决方案可行,答案也没有意义。

那么做到这一点:

1)定义的功能

f = @(x)(250-25)./((0.0106+1.89799*10^-3)+(log(x./15)/2*3.14*45)+(1/10*2*3.14.*x))-157.19 

其中-157.19是右手侧(解方程时,这通常做,因为那是可以使用寻找根的方法,例如牛顿 - 拉夫逊方法)。

2)这里有一个复杂的日志(负数)变得很复杂。这意味着fzero在这里不起作用(这并不重要,这不是你的域名)。幸运的是,在matlab中有另一个数值方程求解器可以处理这个fsolve

求解方程,尝试

myRoot = fsolve(f,15) % Number is tested to work good in this case and not 
         % a general best guess for numerical solutions 

如果试图从你将有复数的舍入误差的别的路可走。尝试,

myRoot = fsolve(f,4) 

这意味着要获得您需要删除答案的虚部(这是在这里安全的,因为你知道,虚部来自一个舍入误差),真正的解决方案。

myRoot = real(fsolve(f,4)) 
+0

很好的答案! (和你的评论当然是正确的,很好的捕获)=) – 2014-12-09 15:58:21

+0

顺便说一句,像'fzero(f,[13.33 20])'确实有效。需要找到下界以便发生符号变化,所以需要知道根的近似值。在这种情况下,fsolve显然是一个更强大的通用解算器。 – horchler 2014-12-09 21:18:52

+0

@horchler我看到了,对于苛刻的语气感到抱歉。我也删除了我的评论。 – patrik 2014-12-10 07:04:10