Mathematica 中的“upvalue”是什么意思以及何时使用它们?

2024-02-23

To me, g /: f[g[x_]] := h[x]只是详细地等价于f[g[x_]] := h[x]。你能举一个你必须使用的例子吗/:?


实际上,g /: f[g[x_]] := h[x]不等于f[g[x_]] := h[x]。后者将定义与f, while (/:) and (^=和它的, ^:=) 将定义与g。这是一个至关重要的区别,可以通过一个简单的例子来说明。假设您想要一组服从模 5 加法的变量,即 6 + 7 mod 5 = 3。所以,我们想要任何Head mod行为正确。最初,我们会认为

a_mod + b_mod := mod@Mod[a + b, 5]

会工作。但是,它会产生错误

SetDelayed::write : Tag Plus in a_mod + b_mod is Protected.

我们可以删除Unprotect Plus然后我们的定义就可以工作,但这可能会导致其他定义出现问题,并且Plus积累更多的定义,它会变慢。或者,我们可以将加法属性与mod对象本身通过TagSet

mod /: mod[a_] + mod[b_] := mod @ Mod[a + b, 5]

or UpSetDelayed

mod[a_] + mod[b_] ^:= mod @ Mod[a + b, 5]

设置一个从概念的角度来看更正确,因为mod是具有不同属性的那个。

有几个问题需要注意。首先,upvalue机制只能扫描一层深度,即Plus[a_mod, b_mod]很好,但是Exp[Plus[a_mod, b_mod]]会抛出错误。这可能需要您对中间类型发挥创意。其次,从编码角度UpSetDelayed更容易写,但有时会出现一些歧义Head是与之相关的上值。TagSet通过显式命名适当的来处理这个问题Head,一般来说,这是我更喜欢的UpSet.

Mathematica 的一些运算符没有任何与其相关的行为,因此它们不受保护。对于这些运算符,您可以根据需要定义函数。例如,我定义了

a_ \[CircleTimes] b_ := KroneckerProduct[a,b]
a_ \[CircleTimes] b_ \[CircleTimes] c__ := a \[CircleTimes] ( b \[CircleTimes] c )

and

a_ \[CirclePlus] b__ := BlockDiagonal[{a,b}]

为我经常使用的矩阵运算提供方便的速记符号。

我上面的例子有点做作,但是很多时候UpValues已经派上用场了。例如,我发现我需要一种符号形式来表示复数根,该符号形式在乘法和求幂下表现得适当。

Example:一个简单且有用的例子是标记Symbol作为真实的:

makeReal[a__Symbol] := (
     # /: Element[#, Reals] := True; 
     # /: Im[#] := 0; 
     # /: Re[#] := #;
     # /: Abs[#] := Sign[#] #;
     # /: Arg[#] := Piecewise[{{0, Sign[#] >= 0}, {Pi, Sign[#] < 0}}]
   ) & /@ List[a]

注意使用TagSet as Element[ a, Reals ] ^:= True会很含糊。该规则将附加到什么a or Reals?另外,如果我们想要一个正实数,我们可以设置Arg[#]:=0这使得Simplify按预期行事,例如Simplify[Sqrt[a^2]] == a.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Mathematica 中的“upvalue”是什么意思以及何时使用它们? 的相关文章

  • mathematica 可以做一些平面几何绘图吗

    我正在尝试使用计算机来显示一些平面几何图 我不知道什么软件可以做到这一点 也不知道mathematica是否可以轻松地生成这样的图 例如 我有以下情节要展示 给定任何三角形 ABC 设 AD 为平分角 BAC 并与 BC 相交于 D 的线
  • Mathematica 中的“upvalue”是什么意思以及何时使用它们?

    To me g f g x h x 只是详细地等价于f g x h x 你能举一个你必须使用的例子吗 实际上 g f g x h x 不等于f g x h x 后者将定义与f while and 和它的 将定义与g 这是一个至关重要的区别
  • 重新定义 Mathematica 中的非交换乘法

    Mathematicas NonCommutativeMultiply 不会简化诸如 a 0 0 a 0 a 1 1 a a or a a a 2 我想重新定义 去做这个 我使用 NCAlgebra 来执行此操作 但我需要 ReplaceR
  • 确定一个集合是否是另一个集合的子集的有效代码

    我正在寻找一种有效的方法来确定一个集合是否是 Matlab 或 Mathematica 中另一个集合的子集 例子 集合 A 1 2 3 4 集合 B 4 3 集 C 3 4 1 集合 D 4 3 2 1 输出应该是 设置A 集合B和C属于集
  • 在 Mathematica 中使用多个包和引用构建应用程序包

    我正在 Mathematica 中构建一个应用程序包 应用程序包含多个包并引用其他应用程序包 为了设置一切 我使用并遵循了工作台帮助部分的应用程序包说明 该部分也可以在以下位置找到 http reference wolfram com wo
  • 设计方法:过载与开关?

    关于封装设计的性能和可扩展性 最好是 重载 函数名称 让 Mathematica 根据模式 条件 测试以及系统对定义的排序方式来确定要使用哪个版本 或者使用 Switch 或类似命令 构建单个函数来直接求值 Mathematica 的表达能
  • 在mathematica中使用Input[]输入数据

    我怎样才能在这段代码中使输入命令对话框中的文本像这样 输入 1 元素 输入 2 元素 For k 1 k n k br Input Enter the i element AppendTo x br 确保您的变量匹配 您可以使用Row来构建
  • 有没有办法自动将Matlab 中的结果或数据导入到Mathematica 中?

    有没有办法将结果或数据 例如矩阵 从Matlab导入到Mathematica自动地 或者有什么方法可以先运行Matlab程序 然后运行Mathematica程序自动地 感谢您提供任何有用的答案 至少有三种方法可以解决这个问题 通过 Java
  • Mathematica 什么时候创建新符号?

    再会 我早些时候以为数学在当前符号中创建新符号 Context在转换输入字符串的阶段 即分配给InString 来输入表达式 即分配给In 但一个简单的例子打破了这一解释 In 1 f During evaluation of In 1 I
  • Mathematica:MathLink 错误消息

    我想我开始理解如何将用 C C 编写的函数链接到数学 我面临的问题是我不知道如何将错误消息从我的 C 包装器发送到 Mathematica 在谷歌搜索后我发现了这个MathLink 教程 http www edenwaith com dev
  • 如何在 Mathematica 中将包含小数点的字母数字(参考)数字转换为字符串

    我有以下类型 DAA76647 1 的参考号 我想将其原封不动地转换为 Mathematica 中的字符串 That is myfn DAA76647 1 给出作为输出 DAA76647 1 是否有捷径可寻 输入不能是字符串 除了转换为字符
  • Mathematica 中的输入/输出单元标签是由什么生成的以及如何向它们添加自动计时?

    当 Mathematica 计算单元格时 它会为输入单元格和输出单元格提供细胞标签 http reference wolfram com mathematica ref CellLabel htmls In Line and Out Lin
  • 可以在 Mathematica 中扩展 PDF、CDF、FindDistributionParameters 等功能吗?

    我开始使用新的 Mathematica 统计和数据分析功能进行越来越多的工作 我周二参加了 Mathematica 统计与数据分析 在线研讨会 非常棒的演讲 我强烈推荐 但我遇到了一些问题 我希望这个论坛上的人可以花点时间考虑一下 我创建了
  • Mathematica 的模式匹配优化不佳?

    我最近询问了为什么PatternTest引起了大量不必要的评估 PatternTest 未优化 https stackoverflow com questions 8484299 patterntest not optimized列昂尼德回
  • 如何在mathematica中自动加载用户定义的函数

    我有一堆在 mathematica 中经常使用的用户定义函数 我想知道是否可以将它们存储在单独的文件中 并且 mathematica 会在启动时加载它们并将它们视为内置函数 这样每当我创建新的 nb 文件时就不必重复定义 类似于 Matla
  • 为什么使用牛顿法的 FindMaximum 会抱怨找不到足够的函数减少?

    首先 这看起来 来自 ContourPlot 是一个相当简单的最大化问题 为什么使用牛顿法的 FindMaximum 会出现问题 其次 如何摆脱警告 第三 如果我无法摆脱这些警告 我如何判断警告是否有意义 即最大化失败 例如 在下面的代码中
  • 如何默认显示动画控件

    在mathematica中这个简单的控制对象中 如下所示 Control x 0 1 我们必须将鼠标指针移至对象的右上角才能获得名为 显示动画控件 的提示 然后单击它以查看播放 前进等动画控件 有没有办法通过设置一些选项来默认情况下打开所有
  • Mathematica 列表轮廓图3D

    我有表格中的数据 x y z f 我在用ListContourPlot3D但我得到的只是一个空盒子 每个方向的尺寸为 1 到 1 这是我的代码 ListContourPlot3D data5 PlotRange gt All AxesLab
  • Mathematica 二维热方程动画

    我正在努力绘制二维温度梯度图 但遇到了很多麻烦 我当前的方法是定义一个插值函数 然后尝试多次绘制它的图表 然后为该图表表设置动画 这是我到目前为止所拥有的 RT 388 726919 R 1 FUNC NDSolve D T x y t t
  • 是否可以从命令行调用 Mathematica 的 diff 功能?

    乌龟SVN http tortoisesvn net 也其他乌龟客户 http tortoisehg bitbucket io about html 包括一个script http osdn net projects tortoisesvn

随机推荐