在matlab中声明复杂的函数

时间:2012-08-15 14:40:04

标签: matlab

我想在Matlab中声明一个非线性复杂函数,所以我写了这个:

>> syms x

>> f=inline((3/2)*(7.02^2))-(2*18*x*((1-(x/18))*(1-(exp(-18/x)))))

但它不起作用并返回此错误:

??? Error using ==> inline.inline at 47
Input must be a string.

如何声明它以便我可以将它用作循环内的函数?

我想以数字方式找到这个函数的根,所以我首先需要声明它,以便我可以在循环中使用它。

2 个答案:

答案 0 :(得分:1)

您的括号出现问题,需要添加单引号:

>>f=inline('((3/2)*(7.02^2))-(2*18*x*((1-(x/18))))*(1-(exp(-18/x)))')

答案 1 :(得分:0)

首先,您应该了解operator precedence,这样您就可以避免许多令人困惑的括号。

其次,正如大多数其他人在这里提到的那样,inline很慢,不适合这个目的。你最好不要使用(以及如何正确使用)匿名函数,a.k.a。函数句柄。

第三,如果你想找到这个函数的根源,你最好使用专门用于此目的的经过广泛测试的Matlab函数,而不是设计&实现自己的版本:

>> f = @(x) 3/2*7.02^2 - 2*18*x.*(1-x/18).*(1-exp(-18./x));    
>> root1 = fzero(f, 14)
root1 = 
    1.440303362822718e+01

>> root2 = fzero(f, 2.5)
root2 = 
     2.365138420421266e+00

>> root3 = fzero(f, 0)    %# (if you're into that kind of perversion)
root3 = 
    0

我通过从-100:100然后unique随机测试结果来找到初始值。这绝不是找到所有根源的有力方法,但我相信你可以提出更好的东西(无论如何,解决问题的方法相当简单)。