我在同一台机器上安装了Mathematica 7.01和Mathematica 5.2.我希望能够在Mathematica 7.01会话中评估v.5.2内核中的代码.我的意思是运行Mathematica 7.0.1标准会话我希望有一个命令,比如kernel5Evaluate评估5.2内核中的一些代码,并将结果返回到7.01内核并链接7.01 FrontEnd笔记本,这样代码将在7.01内核.
例如(在标准的Mathematica v.7.01会话中):
In[1]:= solutionFrom5 = kernel5Evaluate[NDSolve[{(y^\[Prime])[x]==y[x],y[1]==2},y,{x,0,3}]]
Out[1]= {{y -> InterpolatingFunction[{{0., 3.}}, <>]}}
In[2]:= kernel5Evaluate[Plot3D[Sin[x y],{x,-Pi,Pi},{y,-Pi,Pi}]]
During evaluation of In[2]:= GraphicsData["PostScript", "\<\............
Out[2]= -SurfaceGraphics-
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,结果应该好像v.5.2内核在v.7.01 FrontEnd中设置为"Notebook's Kernel".当然solutionFrom5变量应该设置为v.5.2内核返回的实际解决方案.
在我的笔记本中,我有一个相当大的初始化单元.如何让它贴近?我的意思是我怎么能在一行中将这个单元卷起来并具有展开它的能力?
的数学的评估器通常保持(或还原?)Head小号Unevaluated作为参数中提供的表达式的SymbolS:
In[1]:= f[s, Unevaluated[1 + 1]]
Out[2]= f[s, Unevaluated[1 + 1]]
In[5]:= Trace[f[s,Unevaluated[1+1]],TraceOriginal->True]
Out[5]= {f[s,Unevaluated[1+1]],{f},{s},f[s,1+1],f[s,Unevaluated[1+1]]}
Run Code Online (Sandbox Code Playgroud)
但事实并非如此RuleDelayed.此外,在以下情况下剥离任何数量的Unevaluated包装RuleDelayed:
In[1]:= Attributes@RuleDelayed
RuleDelayed[s, Unevaluated[1 + 1]]
RuleDelayed[s, Unevaluated@Unevaluated[1 + 1]]
RuleDelayed[s, Unevaluated@Unevaluated@Unevaluated[1 + 1]]
RuleDelayed[Unevaluated@Unevaluated@Unevaluated[1 + 1], 1 + 1]
Out[1]= {HoldRest, Protected, SequenceHold}
Out[2]= s :> 1 + 1
Out[3]= s :> 1 + 1
Out[4]= s :> 1 + 1
Out[5]= 2 :> 1 + 1 …Run Code Online (Sandbox Code Playgroud) 最近,我发现了一些旧帖子上MathGroup其中无证命令行选项的使用-batchinput和-batchoutput所示:
If test.mma contains the following commands:
a=2+2
b=10!;
a+b
then, running Mathematica in batch mode, only output for the first and
third commands goes to stdout:
# math -batchinput -batchoutput < test.mma
4
3628804
Run Code Online (Sandbox Code Playgroud)
但是当尝试在Windows下重现此行为时,我只在控制台窗口中打印出第一个输出.我究竟做错了什么?
当试图模拟RuleDelayed我遇到嵌套的意外行为的评估行为时Unevaluated.考虑:
In[1]:= f[Verbatim[Unevaluated][expr_]] := f[expr]
f[Unevaluated[1 + 1]]
f[Unevaluated@Unevaluated[1 + 1]]
f[Unevaluated@Unevaluated@Unevaluated[1 + 1]]
f[Unevaluated@Unevaluated@Unevaluated@Unevaluated[1 + 1]]
Out[2]= f[Unevaluated[1 + 1]]
Out[3]= f[2]
Out[4]= f[Unevaluated[1 + 1]]
Out[5]= f[2]
Run Code Online (Sandbox Code Playgroud)
可以看到,只有偶数个嵌套Unevaluated包装器被完全删除.为什么?
使用Messages内置功能都嵌入线格式.例如:
In[1]:= ActionMenu::usage // FullForm
Out[1]//FullForm=
"\!\(\*RowBox[{\"ActionMenu\", \"[\", RowBox[{StyleBox[\"name\", \"TI\
\"], \",\", RowBox[{\"{\", \
RowBox[{RowBox[{SubscriptBox[StyleBox[\"lbl\", \"TI\"], \
StyleBox[\"1\", \"TR\"]], \":>\", SubscriptBox[StyleBox[\"act\", \"TI\
\"], StyleBox[\"1\", \"TR\"]]}], \",\", \
RowBox[{SubscriptBox[StyleBox[\"lbl\", \"TI\"], StyleBox[\"2\", \
\"TR\"]], \":>\", SubscriptBox[StyleBox[\"act\", \"TI\"], \
StyleBox[\"2\", \"TR\"]]}], \",\", StyleBox[\"\[Ellipsis]\", \
\"TR\"]}], \"}\"}]}], \"]\"}]\) represents an action menu with label \
\!\(\*StyleBox[\"name\", \"TI\"]\), and with items labeled \
\!\(\*SubscriptBox[StyleBox[\"lbl\", \"TI\"], StyleBox[\"i\", \
\"TI\"]]\), that evaluates the expression \
\!\(\*SubscriptBox[StyleBox[\"act\", \"TI\"], StyleBox[\"i\", \
\"TI\"]]\) if the corresponding item is …Run Code Online (Sandbox Code Playgroud) 在以前的线程的有效方式删除空列表({}从列表)建议:
Replace[expr, x_List :> DeleteCases[x, {}], {0, Infinity}]
Run Code Online (Sandbox Code Playgroud)
使用Trott-Strzebonski就地评估技术,这种方法可以推广用于同时使用保持的表达式:
f1[expr_] :=
Replace[expr,
x_List :> With[{eval = DeleteCases[x, {}]}, eval /; True], {0, Infinity}]
Run Code Online (Sandbox Code Playgroud)
此解决方案比基于以下方案的解决方案更有效ReplaceRepeated:
f2[expr_] := expr //. {left___, {}, right___} :> {left, right}
Run Code Online (Sandbox Code Playgroud)
但它有一个缺点:如果它们被包装,它会对持有的表达式进行求值List:
In[20]:= f1[Hold[{{}, 1 + 1}]]
Out[20]= Hold[{2}]
Run Code Online (Sandbox Code Playgroud)
所以我的问题是:在{}不评估保持表达式的情况下从列表中删除所有空列表()的最有效方法是什么?只有当它是另一个自身的元素时,才List[]应删除空对象.List
以下是一些时间安排:
In[76]:= expr = Tuples[Tuples[{{}, {}}, 3], 4];
First@Timing[#[expr]] & /@ {f1, f2, f3}
pl = Plot3D[Sin[x y], {x, …Run Code Online (Sandbox Code Playgroud) 为某些临时上下文生成名称的最佳方法是什么,该上下文保证是唯一的(系统中不能存在具有此名称的上下文)?
我正在寻找Mathematica中以小写字母开头的危险符号名称的完整列表.
在这一刻,我知道三个这样的名称:min,max和lim.这些名称出现在LimitsPositioningTokens列表中,并且至少在使用上标输入FrontEnd时被视为运算符:
In[3]:= Options[$FrontEnd,LimitsPositioningTokens]
Out[3]= {LimitsPositioningTokens->{\[Sum],\[Product],\[Intersection],
\[Union],\[UnionPlus],\[Wedge],\[Vee],lim,max,min,\[CirclePlus],
\[CircleMinus],\[CircleTimes],\[CircleDot]}}
Run Code Online (Sandbox Code Playgroud)
例如,键入FrontEnd以下(使用Ctrl+ ^来制作上标 - 这很重要!):
In[1]:= max^n+4
(max^n+4)//HoldComplete//FullForm
Out[1]= 4 max^n
Out[2]//FullForm= HoldComplete[Times[Power[max,n],Plus[4]]]
Run Code Online (Sandbox Code Playgroud)

您会看到在这种情况下max^n+4解释为4*max^n.
任何人都可以解释什么LimitsPositioningTokens选项真的吗?
在Mathematica中是否还有以小写字母开头的其他危险符号?
在对我之前的问题的评论中,建议从Mathematica 5.2 InterpolatingFunction生成所有数据,然后在Mathematica 8中创建另一个数据.建议的方法是使用包中定义的函数从中提取数据.天真地尝试,DifferentialEquations`InterpolatingFunctionAnatomy`InterpolatingFunction
Needs["DifferentialEquations`InterpolatingFunctionAnatomy`"]
ifun = First[
x /. NDSolve[{x'[t] == Exp[x[t]] - x[t], x[0] == 1},
x, {t, 0, 10}]];
data = Transpose@{InterpolatingFunctionGrid[ifun],
InterpolatingFunctionValuesOnGrid[ifun]};
interpolationOrder =
Developer`FromPackedArray@
InterpolatingFunctionInterpolationOrder[ifun];
ifun2 = Interpolation[data, InterpolationOrder -> interpolationOrder];
Table[ifun[x] - ifun2[x], {x, 0, 0.5160191740198963`, .1}]
Run Code Online (Sandbox Code Playgroud)
我在原始函数和重构函数之间有显着差异:
{0., 2.13061*10^-7, 2.05087*10^-7, 2.46198*10^-7, 6.68937*10^-7,
1.5624*10^-7}
Run Code Online (Sandbox Code Playgroud)
查看InputForm这些功能可以发现它们并不完全相同.是否有可能重建InterpolatingFunction从中提取所有数据并调用Interpolation提取的数据?