定义函数
今天写代码,有这么一个小需求,把下图这种函数存起来,然后需要的时候直接f(x)调用即可。
syms t
f(t) = 6.8325/31.2834*(t/31.2834).^5.8325+0.0355;
f(1)
输出如下:
(11776458799446781745235478509123152584204402148589076107170397814784*35184372088832^(333/400)*1100686785803767^(67/400))/1778207819741065749175205515179961799530525717937163894599563129249164422846114600496707569 + 71/2000
牛批,这是人看的吗?
网上查找了一下,vpa()函数说的人很多,但是位数也太多了,虽然也有方法设置位数,但我发现直接double()也可以,4位小数一般也够用了。
>> vpa(f(1))
ans =
0.035500000414807970186928389994056
---------------------------------------
>> double(f(1))
ans =
0.0355
但感觉还是不太方便,每次输出都要套个函数,可不可以直接就设置matlab输出结果以小数显示呢?
有看到推荐用format函数,这个确实是可以控制输出格式,但是我发现对于f(1)这种情况不适用:
>> format short
>> 1/2
ans =
0.5000
>> f(1)
ans =
(11776458799446781745235478509123152584204402148589076107170397814784*35184372088832^(333/400)*1100686785803767^(67/400))/1778207819741065749175205515179961799530525717937163894599563129249164422846114600496707569 + 71/2000
>> format long
>> 1/2
ans =
0.500000000000000
>> f(1)
ans =
(11776458799446781745235478509123152584204402148589076107170397814784*35184372088832^(333/400)*1100686785803767^(67/400))/1778207819741065749175205515179961799530525717937163894599563129249164422846114600496707569 + 71/2000
这个问题暂时搁置一下,起码目前我们知道有double()这种略显繁琐的解决方式。
我想记录一下今天犯的一个有点蠢的错误,发生在定义函数的过程中。网上教程很简单嘛,官方的我也看了,syms x
一下,然后f = 2 * x + 1
这样子就可以了。结果如下:
>> syms x
>> f = 2 * x + 1
f =
2*x + 1
>> f(1)
ans =
2*x + 1
什么情况?为什么不给我返回具体值呢?我在中间发生的曲折求索就不多说了,问题出在f = 2 * x + 1
,是要f(x) = 2 * x + 1
才对!f
后面要带括号加上自变量!
>> syms x
f(x) = 2 * x + 1
f(1)
f(x) =
2*x + 1
ans =
3
定义函数的话,网上还有一种匿名函数的方法也挺简单的,格式如下:
>> f = @(x)(2 * x + 1)
f =
包含以下值的 function_handle:
@(x)(2*x+1)
>> f(1)
ans =
3
求反函数
然后我今天还有一个求反函数的需求,网上查一下是finverse
这个函数,简单用法如下:
>> syms x
f(x)=2*x+1
g(x)=finverse(f)
f(x) =
2*x + 1
g(x) =
x/2 - 1/2
>> g(1)
ans =
0
>> g(3)
ans =
1
但是如果用f = @(x)(2 * x + 1)
这种方式定义,用finverse
求反函数就会有如下的小问题,可能有相应的解决方式,但是我已经不想去探究了。
>> f = @(x)(2*x+1)
f =
包含以下值的 function_handle:
@(x)(2*x+1)
>> g=finverse(f)
检查对函数 'finverse' 的调用中是否缺失参数或参数数据类型不正确。
精度问题
>> syms t
f(t)=6.8325/31.2834*(t/31.2834).^5.8325+0.0355;
double(f(1))
ans =
0.0355
>> g(t)=finverse(f);
g(0.0355)
ans =
0
>> g(f(1))
ans =
(1100686785803767*((53919893334301279589334030174039261347274288845081144962207220498432*35184372088832^(333/400)*1100686785803767^(67/400))/1778207819741065749175205515179961799530525717937163894599563129249164422846114600496707569)^(400/2333))/35184372088832
>> double(g(f(1)))
ans =
1
>> g(double(f(1)))
ans =
(1100686785803767*1868129017^(400/2333)*983615734031752000^(1933/2333))/34607901978602775065252593664000
>> double(g(double(f(1))))
ans =
1.0000
所以尽量避免中间过程的过度,不然一步步的误差积累下来可能结果就差得远了。
总结
- 定义函数用
syms
的方式 - 求反函数用
finverse
的方式