【MATLAB】函数定义与反函数

定义函数

今天写代码,有这么一个小需求,把下图这种函数存起来,然后需要的时候直接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的方式
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值