Can*_*tor 6 wolfram-mathematica
我想写一个
Module Arg[f_,n_]
Run Code Online (Sandbox Code Playgroud)
它接受函数f(具有<= n个参数)和自然数n并输出函数f的第n个参数.
例如,假设f由...定义
f[a_,b_]=a^2+b^2.
Run Code Online (Sandbox Code Playgroud)
然后,
Arg[f[s,t],1]
Run Code Online (Sandbox Code Playgroud)
应该是;
而
Arg[f[u,v],2]
Run Code Online (Sandbox Code Playgroud)
应该是v.
我的问题是这是否可行.如果是这样,我应该写什么"???" 下面?
Arg[f_,n_] := Module[{}, ??? ]
Run Code Online (Sandbox Code Playgroud)
注意,我不想在Arg的定义中指定a_和b_
Arg[f_,a_,b_,n_]
Run Code Online (Sandbox Code Playgroud)
编辑:"Arg"只是模块的名称而不是Mathematica的内部函数Arg.
Dr.*_*ius 10
也许
SetAttributes[arg, HoldFirst];
arg[f_[x___], n_] := {x}[[n]]
f[a_, b_] := a^2 + b^2.
arg[f[arg[f[s, t], 1], t], 1]
arg[f[s, t], 2]
(*
-> s
-> t
*)
arg[ArcTan[f[Cos@Sin@x, x], t], 1]
(*
-> x^2. + Cos[Sin[x]]^2
*)
Run Code Online (Sandbox Code Playgroud)
假设你的第二个例子应该给出u,这应该做的工作:
ClearAll[arg];
SetAttributes[arg, HoldFirst];
arg[g_, n_] := Module[
{tmp, ret},
Unprotect[Part];
tmp = Attributes[Part];
SetAttributes[Part, HoldFirst];
ret = Part[g, n];
ClearAttributes[Part, HoldFirst];
SetAttributes[Part, tmp];
Protect[Part];
ret
]
Run Code Online (Sandbox Code Playgroud)
以便
f[a_, b_] = a^2 + b^2.;
arg[f[s, t], 1]
Run Code Online (Sandbox Code Playgroud)
给s.
虽然这非常严厉,所以我希望有人能够尽快找到更好的东西.
这有点好(甚至暂时不重新定义内置函数):
ClearAll[arg2];
SetAttributes[arg2, HoldFirst];
arg2[g_, n_] := Hold[g][[1, n]]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1161 次 |
| 最近记录: |