gpt4 book ai didi

wolfram-mathematica - 通过 MathLink 从 v.7.01 session 中执行 v.5.2 内核中的代码

转载 作者:行者123 更新时间:2023-12-04 08:13:23 25 4
gpt4 key购买 nike

我在同一台机器上安装了 Mathematica 7.01 和 Mathematica 5.2。我希望能够在 Mathematica 7.01 session 中评估 v.5.2 内核中的代码。我的意思是,在运行 Mathematica 7.0.1 标准 session 时,我希望有一个类似 kernel5Evaluate 的命令。评估 5.2 内核中的一些代码并将结果返回到 7.01 内核和链接的 7.01 前端笔记本中,这样这些代码将在 7.01 内核中执行。

例如(在标准 Mathematica v.7.01 session 中):

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-

在这两种情况下,结果应该就像 v.5.2 内核在 v.7.01 前端中设置为“笔记本内核”一样。当然还有 solutionFrom5变量应设置为 v.5.2 内核返回的真实解。

最佳答案

这是基于 Simon 代码的实现。它仍然需要改进。我不清楚的一件事是如何处理从 (v.5.2) 内核中生成的消息。

这是我的代码:

Clear[linkEvaluate]
SetAttributes[linkEvaluate, HoldRest]
linkEvaluate[link_LinkObject, expr_] := Catch[
Module[{out = {}, postScript = {}, packet, outputs = {}},
While[LinkReadyQ[link],
Print["From the buffer:\t", LinkRead[link]]];
LinkWrite[link, Unevaluated[EnterExpressionPacket[expr]]];
While[Not@MatchQ[packet = LinkRead[link], InputNamePacket[_]],
Switch[packet,
DisplayPacket[_], AppendTo[postScript, First@packet],
DisplayEndPacket[_], AppendTo[postScript, First@packet];
CellPrint@
Cell[GraphicsData["PostScript", #], "Output",
CellLabel -> "Kernel 5.2 PostScript ="] &@
StringJoin[postScript]; postScript = {},
TextPacket[_],
If[StringMatchQ[First@packet,
WordCharacter .. ~~ "::" ~~ WordCharacter .. ~~ ": " ~~ __],
CellPrint@
Cell[BoxData@
RowBox[{StyleBox["Kernel 5.2 Message = ",
FontColor -> Blue], First@packet}], "Message"],
CellPrint@
Cell[First@packet, "Output", CellLabel -> "Kernel 5.2 Print"]],
OutputNamePacket[_], AppendTo[outputs, First@packet];,
ReturnExpressionPacket[_], AppendTo[outputs, First@packet];,
_, AppendTo[out, packet]
]
];
If[Length[out] > 0, Print[out]];
Which[
(l = Length[outputs]) == 0, Null,
l == 2, Last@outputs,
True, multipleOutput[outputs]
]
]];
Clear[kernel5Evaluate]
SetAttributes[kernel5Evaluate, HoldAll]
kernel5Evaluate[expr_] :=
If[TrueQ[MemberQ[Links[], $kern5]], linkEvaluate[$kern5, expr],
Clear[$kern5]; $kern5 = LinkLaunch[
"C:\\Program Files\\Wolfram Research\\Mathematica\\5.2\\MathKernel.exe -mathlink"];
LinkRead[$kern5];
LinkWrite[$kern5,
Unevaluated[EnterExpressionPacket[$MessagePrePrint = InputForm;]]];
LinkRead[$kern5]; kernel5Evaluate[expr]]

以下是测试表达式:
plot = kernel5Evaluate[Plot3D[Sin[x y], {x, 0, Pi}, {y, 0, Pi}]]
plot = kernel5Evaluate[Plot[Sin[x], {x, 0, Pi}]; Plot[Sin[x], {x, -Pi, Pi}]] //
DeleteCases[#, HoldPattern[DefaultFont :> $DefaultFont], Infinity] &
s = kernel5Evaluate[
NDSolve[{y'[x] == y[x] Cos[x + y[x]], y[0] == 1}, y, {x, 0, 30}]]
s // InputForm // Short
kernel5Evaluate[1/0; Print["s"];]

它似乎按预期工作。然而,它可能会更好......

关于wolfram-mathematica - 通过 MathLink 从 v.7.01 session 中执行 v.5.2 内核中的代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4983301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com