Mathematica进阶[5]–关于Evaluate的使用

  • A+
所属分类:Wolfram语言进阶
摘要这里会介绍一个Mathematica的Evaluate函数,这个函数在你遇到一些式子无法被赋值的时候会给你带来帮助。

 

更新:

关于下面问题的解释有点问题,大家可以看评论区。由于这些mathematica大多是我自己写得,代码方面多少有些不足,希望大家指出。

 


起因

 

我想将一个函数进行傅立叶级数展开,并对展开的式子另成一个新的函数。

Mathematica进阶[5]--关于Evaluate的使用

 

使用如上的式子进行傅立叶展开,并将展开的式子保存到normal里面。接着我想往normal里的t代值,首先我想到了替换的方法

Mathematica进阶[5]--关于Evaluate的使用

问题

 

上面这样是可以的,但是我觉得我样写不方便扩展,能否将上面的式子写成函数的表达形式呢,于是我进行了下面的操作。

Mathematica进阶[5]--关于Evaluate的使用

但是发现这样t是无法被代入赋值的,可以看到上面这个式子在使用test[3]后得到的式子里还有t,也就是说t=3没有被代入。那么是什么原因导致的呢。

 

解决方法

我们看一下FourierSinSeries的属性,如下图,可以看到有一个Protected的属性,就是表达式不能被修改。

Mathematica进阶[5]--关于Evaluate的使用

我们可以使用已下的方法解决问题--使用Evaluate

Mathematica进阶[5]--关于Evaluate的使用

我们可以看到,在式子前面加上Evaluate后,在使用test[3]就看到式子被成功赋值了。到这里,问题就被成功解决了。

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:10   其中:访客  6   博主  4

    • avatar wjxway

      不是因为Protect这个属性才导致需要加Evaluate的~
      是因为HoldAll属性会制止所有输入f之前的运算,用Evaluate会强制先运算。
      btw,鄙人拙见,这一个系列教程写的不够系统,且部分内容的解法和思路并不是最好的~建议写成“用Mathematica解决小问题”而不是完整的教程~

        • avatar 王 茂南 Admin

          @wjxway 关于第一个问题,看了Evaluate的帮助,Evaluate是用来重载HoldFirst的,但是HoldAll属性应该从哪里看呢,Attributes[FourierSinSeries]里并不能看出HoldAll属性。

          关于第二个问题,确实这个教程有很多不足,暂时这里就是记录一些我在mma里遇到的问题和解决的办法,还有放一些我做到的mma的题目。

          其实我做这个网站,我感觉最重要的是希望可以作出完整的高数的图解的解释,其他就是零零散散记录一些。

            • avatar wjxway

              @王 茂南 哦哦,是HoldFirst,没仔细看,就是Evaluate可以把上一层的Hold属性干掉的意思。

                • avatar 王 茂南 Admin

                  @wjxway 这个HoldFirst是不能使用Attributes来查看的吗,比如我使用Attributes[Hold]可以看到有HoldAll这个属性,但是查看Attributes[FourierSinSeries]就没有HoldAll这个属性。

            • avatar wjxway

              啊啊,我又仔细看了下具体的问题,刚刚用手机没仔细看,抱歉……
              是这样子,你这段代码展开FullForm是SetDelayed[…..],而SetDelayed是有HoldAll这个Attributes的,问题出在这里。
              如果你不Evaluate一下normal,那么这个表达式会以如下形式存进test的DownValues: HoldPattern[test[t_]]:->normal,或者通俗些说,假如碰到test[t_],变成normal就对了~然而,对于模式匹配器来说,normal这个未被运行的表达式里面并没有显式的t,所以就直接返回normal就可以。于是不能达到把t带入的目的。
              假如Evaluate,那么Evaluate会促使后面normal变成一个带t的式子先于SetDelayed进行运算,于是存入DownValues的就是HoldPattern[test[t_]]:->******,后面则是带t的了,于是就可以实现目标了。

                • avatar wjxway

                  @wjxway 很简单的说,你可以试试用f[t_]=***来定义,你就发现这玩意是能输出合适的结果的!
                  原因就在于,Set要求即时的赋值,也就是说右侧得在定义时计算,故是HoldFirst。而SetDelayed是延迟赋值,或者说定义得好好留着用的时候再赋值,所以用HoldAll。

                  • avatar 王 茂南 Admin

                    @wjxway 这个解释能看懂了,就是说没有使用Evaluate的话,normal是有HoldAll属性的,所以赋值的时候并不会被计算。

                  • avatar wjxway

                    Protect的意思是什么呢,是说这玩意比较重要,你直接去重置它的特性是不行的,基本上所有的内置函数都不想让你乱改,所以都有Protected。
                    这只会导致FourierSinSeries=1这类操作失败。
                    ReadProtected则是说,这段代码定义你不能乱看。
                    所以?FourierSinSeries看不到直接定义。
                    这些和你上面遇到的问题是不一样的。
                    建议阅读以下Hold系列,这一坨运算控制还是很复杂的,会导致各种问题。

                    • avatar Voldikss

                      代码图,不见了 :?:

                        • avatar 王 茂南 Admin

                          @Voldikss 感谢指出问题,现在已经修复,图片可以正常显示了。