1

我想在 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.

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

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

4

2 回答 2

1

您的括号有一些问题,需要添加单引号:

>>f=inline('((3/2)*(7.02^2))-(2*18*x*((1-(x/18))))*(1-(exp(-18/x)))')
于 2012-08-15T14:44:36.630 回答
0

首先,您应该了解运算符优先级,这样您就可以避免许多令人困惑的括号。

其次,正如大多数其他人在这里提到的那样,inline速度很慢,不适合这个目的。你最好使用(并学习如何正确使用)匿名函数,也就是函数句柄。

第三,如果你想找到这个函数的根源,你最好使用专门为此目的经过广泛测试的 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对结果进行测试来找到初始值。这绝不是找到所有根源的可靠方法,但我相信您可以提出更好的方法(无论如何,这个问题很容易通过分析来解决)。

于 2012-08-16T12:15:59.000 回答