是否有可能在计算过程中暂停Mathematica内核?这是一个例子.
Module[{},
Mathematica code....
..........
..........
{
Calls an external program with some argument
Needs to wait for an external program to create a file (* How ?*)
}
Mathematica code using that file content....
...........
...........
]
Run Code Online (Sandbox Code Playgroud)
我可以提出一个Do[..]循环解决方案,继续检查指定的目录是否创建了文件.一旦找到文件,它就会读取内容,Mathematica代码的其余部分会处理数据.
有没有优雅的方法来解决这个问题?
BR
让我们来看看积分.
pt={{-4.65371,0.1},{-4.68489,0.103169},{-4.78341,0.104834},{-4.83897,0.100757},
{-4.92102,0.0949725},{-4.93456,0.100181},{-4.89166,0.122666},{-4.78298,0.129514},
{-4.72723,0.121442},{-4.68355,0.11023},{-4.65371,0.1},{-4.66924,0.10173},
{-4.93059,0.0966989},{-4.93259,0.105094},{-4.91074,0.116966},{-4.90635,0.094878},
{-4.66846,0.105327},{-4.92647,0.0956182},{-4.93433,0.102498},{-4.9333,0.0982262},
{-4.66257,0.10102}};
Run Code Online (Sandbox Code Playgroud)
现在他们处于一定的顺序(对我来说是一种混乱!),如果我们看一下就可以看到 ListLinePLot
picUnorder=ListLinePlot[pt,Frame-> True,Mesh-> All,MeshStyle-> PointSize[Large]];
SeepicUnorder=ListLinePlot[pt,Frame-> True,Mesh-> All,MeshStyle->
PointSize[Large]]/.Line[rest_]:>{Arrowheads[Table[0.02,{i,0,1,.02}]],Arrow[rest]};
GraphicsGrid[{{picUnorder,SeepicUnorder}}]
Run Code Online (Sandbox Code Playgroud)

但是我们需要像下面的图片那样订购它们.

是否有人建议使用算法在逆时针方向对这些2D点进行排序,以便我们可以重新排列点列表以创建像最后一张图片一样的几何图形,只需ListLinePlot在重新排列的点上使用????
使用该建议我们得到类似以下内容.
center=Mean[pt];
pts=SortBy[pt,Function[p,{x,y}=p-center;ArcTan[x,y]]];
Show[ListPlot[pt],ListLinePlot[pts,Mesh-> All,MeshStyle->
PointSize[Large]],Frame-> True]
Run Code Online (Sandbox Code Playgroud)

BR
我对Mathematica的全局优化能力有疑问.我偶然发现了与NAG工具箱相关的文本(白皮书).
现在我试图从论文中解决测试用例.正如预期的那样,Mathematica解决它的速度非常快.
n=2;
fun[x_,y_]:=10 n+(x-2)^2-10Cos[2 Pi(x-2)]+(y-2)^2-10 Cos[2 Pi(y-2)];
NMinimize[{fun[x,y],-5<= x<= 5&&-5<= y<= 5},{x,y},Method->{"RandomSearch","SearchPoints"->13}]//AbsoluteTiming
Run Code Online (Sandbox Code Playgroud)
输出是
{0.0470026,{0.,{x->2.,y->2.}}}
Run Code Online (Sandbox Code Playgroud)
可以看到优化例程访问的点.
{sol, pts}=Reap[NMinimize[{fun[x,y],-5<= x<= 5&&-5<= y<= 5},{x,y},Method->`{"RandomSearch","SearchPoints"->13},EvaluationMonitor:>Sow[{x,y}]]];Show[ContourPlot[fun[x,y],{x,-5.5,5.5},{y,-5.5,5.5},ColorFunction->"TemperatureMap",Contours->Function[{min,max},Range[min,max,5]],ContourLines->True,PlotRange-> All],ListPlot[pts,Frame-> True,Axes-> False,PlotRange-> All,PlotStyle-> Directive[Red,Opacity[.5],PointSize[Large]]],Graphics[Map[{Black,Opacity[.7],Arrowheads[.026],Arrow[#]}&,Partition[pts//First,2,1]],PlotRange-> {{-5.5,5.5},{-5.5,5.5}}]]`
Run Code Online (Sandbox Code Playgroud)

现在我想到在更高维度上解决同样的问题.对于五个变量的问题,即使允许大量搜索点,mathematica也开始陷入局部最小陷阱.
n=5;funList[x_?ListQ]:=Block[{i,symval,rule},
i=Table[ToExpression["x$"<>ToString[j]],{j,1,n}];symval=10 n+Sum[(i[[k]]-2)^2-10Cos[2Pi(i[[k]]-2)],{k,1,n}];rule=MapThread[(#1-> #2)&,{i,x}];symval/.rule]val=Table[RandomReal[{-5,5}],{i,1,n}];vars=Table[ToExpression["x$"<>ToString[j]],{j,1,n}];cons=Table[-5<=ToExpression["x$"<>ToString[j]]<= 5,{j,1,n}]/.List-> And;NMinimize[{funList[vars],cons},vars,Method->{"RandomSearch","SearchPoints"->4013}]//AbsoluteTiming
Run Code Online (Sandbox Code Playgroud)
输出不是我们想要看到的.在我的core2duo机器上花了49秒,仍然是当地的最低限度.
{48.5157750,{1.98992,{x$1->2.,x$2->2.,x$3->2.,x$4->2.99496,x$5->1.00504}}}
Run Code Online (Sandbox Code Playgroud)
然后尝试了SimulatedAnealing 100000次迭代.
NMinimize[{funList[vars],cons},vars,Method->"SimulatedAnnealing",MaxIterations->100000]//AbsoluteTiming
Run Code Online (Sandbox Code Playgroud)
产量仍然不合适.
{111.0733530,{0.994959,{x$1->2.,x$2->2.99496,x$3->2.,x$4->2.,x$5->2.}}}
Run Code Online (Sandbox Code Playgroud)
现在,Mathematica有一个名为Minimize的精确优化算法.正如预期的那样,必须在实用性方面失败,但随着问题规模的增加,它会很快失败.
n=3;funList[x_?ListQ]:=Block[{i,symval,rule},i=Table[ToExpression["x$"<>ToString[j]],{j,1,n}];symval=10 n+Sum[(i[[k]]-2)^2-10Cos[2 Pi(i[[k]]-2)],{k,1,n}];rule=MapThread[(#1-> #2)&,{i,x}];symval/.rule]val=Table[RandomReal[{-5,5}],{i,1,n}];vars=Table[ToExpression["x$"<>ToString[j]],{j,1,n}];cons=Table[-5<=ToExpression["x$"<>ToString[j]]<= 5,{j,1,n}]/.List-> And;Minimize[{funList[vars],cons},vars]//AbsoluteTiming
Run Code Online (Sandbox Code Playgroud)
输出完全没问题.
{5.3593065,{0,{x$1->2,x$2->2,x$3->2}}}
Run Code Online (Sandbox Code Playgroud)
但是如果用n = 4进一步改变问题大小,你会看到结果.解决方案在我的笔记本中不会出现很长时间.
现在问题很简单,这里的任何人都认为有一种方法可以在Mathematica中有效地数值解决这个问题以获得更高维度的案例吗?让我们分享我们的想法和经验.但是应该记住,它是一个基准的非线性全局优化问题.大多数数字根寻找/最小化算法通常搜索局部最小值.
BR
P
我正在尝试使用CUSP作为Mathematica的外部线性求解器来使用GPU的强大功能.这是CUSP项目网页.我想问一下如何将CUSP与Mathematica集成.我相信你们中的许多人都有兴趣讨论这个问题.我认为编写输入矩阵然后将其提供给CUSP程序是不可取的.使用Mathematica LibrarayFunctionLoad将是一种更好的方法,可以将输入矩阵传输到基于GPU的求解器.直接从Mathematica提供矩阵和右侧矩阵的方法是什么?
这是一些CUSP代码片段.
#include <cusp/hyb_matrix.h>
#include <cusp/io/matrix_market.h>
#include <cusp/krylov/cg.h>
int main(void)
{
// create an empty sparse matrix structure (HYB format)
cusp::hyb_matrix<int, float, cusp::device_memory> A;
// load a matrix stored in MatrixMarket format
cusp::io::read_matrix_market_file(A, "5pt_10x10.mtx");
// allocate storage for solution (x) and right hand side (b)
cusp::array1d<float, cusp::device_memory> x(A.num_rows, 0);
cusp::array1d<float, cusp::device_memory> b(A.num_rows, 1);
// solve the linear system A * x = b with the Conjugate Gradient method
cusp::krylov::cg(A, x, b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这个问题让我们有可能讨论Mathematica 8的编译功能.也可以调用MMA的mathlink接口主题.我希望这里的人们发现这个问题值得思考,有趣,值得思考. …
在mathematica这个简单的控制对象中,如下所示,
Control[{x, 0, 1}]
Run Code Online (Sandbox Code Playgroud)
我们必须将鼠标指针指向对象的右上角以获得名为"显示动画控件"的提示,然后单击它以查看动画控件,如播放,前进等等.有没有办法通过设置一些选项来默认情况下获取所有动画控件OPEN,以便当打开包含动态对象的笔记本时动画控件保持打开状态?
有人知道Mathematica中有这样一个神奇的选择吗?
正如文档中心提供的以下代码所示
Manipulator[0.3, Appearance -> "Open"]
Run Code Online (Sandbox Code Playgroud)
看起来很好,并且适合我的目的但是如何在下面做同样的事情?我们如何在默认情况下将Manipulate中的动画控件保持打开状态?
Manipulate[Plot[Sin[a x + b], {x, 0, 6}], {a, 1, 4}, {b, 0, 10}]
Run Code Online (Sandbox Code Playgroud)
这是我的实际问题,不幸的是仍然令我感到困惑.
我试图从Mathematica生成的表面网格(主要是三角形)制作四边形网格.我不是在寻找高质量的网格物体,而是一种简单的算法算法.我使用GMSH进行外部操作.我们可以利用Mathematic的CAD导入功能来生成Mathematica内核所理解的3D几何.
我们可以看到导入的Geometry3D对象以及它们所包含的每个多边形中的边数.可以看出,形成网格的多边形并不总是三角形.
Name3D=RandomChoice[ExampleData["Geometry3D"][[All,2]],6];
AllPic=
Table[
Vertex=ExampleData[{"Geometry3D",Name3D[[i]]},"VertexData"];
Polygons=ExampleData[{"Geometry3D",Name3D[[i]]},"PolygonData"];
GraphicsGrid[
{{ListPlot[#,Frame-> True,PlotLabel->Name3D[[i]] ]&@(Length[#]&/@Polygons),
Graphics3D[GraphicsComplex[Vertex,Polygon[Polygons]],Boxed-> False]}}
,ImageSize-> 300,Spacings-> {0,0}],
{i,1,Length@Name3D}];
GraphicsGrid[Partition[AllPic,2],Spacings-> {0,0}]
Run Code Online (Sandbox Code Playgroud)

现在我正在寻找的是一种算法,用于根据MMA可用的多边形信息形成四边形网格.任何简单的解决方案都非常受欢迎.通过简单的解决方案,我的意思是,它不能在非常一般的环境中工作(网格构成边长超过5或6的多边形),与商业软件相比可能效率很低.但是人们可以看到,除了少数昂贵的商用之外,没有太多可用的四边形表面网格生成器.
BR
给出两个矢量图和如下的等高线图
as = VectorPlot[{Cos[y], Sin[x] }, {x, -3, 3}, {y, -3, 3},
VectorScale -> Automatic, VectorColorFunction -> "Rainbow"
];
bs = StreamPlot[{Cos[y], Sin[x] }, {x, -3, 3}, {y, -3, 3},
VectorScale -> Automatic, StreamColorFunction -> "Rainbow"
];
cs = ContourPlot[Cos[x] + Sin[y], {x, -3, 3}, {y, -3, 3},
ColorFunction -> "BlueGreenYellow"
];
Show[cs, bs, as]
Run Code Online (Sandbox Code Playgroud)

我们可以看到Show []完成了基本的叠加工作.但我的问题是如何控制背景轮廓图 cs 的不透明度?另外,如何在颜色函数中插入"BlueGreenYellow"类型的颜色方案,如下所示?
ContourPlot[Cos[x] + Sin[y], {x, -3, 3}, {y, -3, 3},
ColorFunction -> (Directive[Opacity[#],Blue] &)
];
Run Code Online (Sandbox Code Playgroud) 这是一个很好的线性求解器,名为GotoBLAS.它可以下载并在大多数计算平台上运行.我的问题是,是否有一种简单的方法可以将此求解器与Mathematica内核相链接,以便我们可以像LinearSolve一样调用它?大多数人肯定会同意的一件事是,如果我们有一个非常大的线性系统,那么我们最好通过一些行业标准的线性求解器来解决它.内置求解器不适用于非常大的问题.
现在Mathematica 8已经提出了更好的编译和库链接功能,我们可以期望在Mathematica中使用一些解算器.问题是需要对源代码进行少量调整,或者您需要成为高级向导才能执行此操作.在这个论坛中,我们可以开始链接一些优秀的开源程序,如GotoBLAS和Mathematica,并交换我们的观点.经验不足的人可以从专业用户那里获得一些见解,最后我们得到了更强大的Mathematica.对于不断增加的Mathematica社区和一个平台来说,这将是一个开放式项目,Mathematica 8的这些新引入的功能可以为未来用户透明地记录下来.
我希望你们中的一些人能够就如何在Mathematica中运行GotoBLAS提供可靠的想法.由于较新的编译和库链接功能通常没有很好地记录,因此普通用户不经常使用它们.这个问题可以作为一个玩具示例来记录Mathematica的这些新功能.经验丰富的论坛成员在这方面的帮助将真正解除像我这样的新用户的动力,并且它将教会我们扩展Mathematica的数字运算库非常有用的东西.
wolfram-mathematica compilation numerical-methods data-structures
这是一个包含 3D 点簇的数据文件。现在我们可以从中形成一个BSpline表面。
dat=Import["C:\\Users\\Andy\\Desktop\\Foil.mat"];
surface=BSplineFunction[dat];
ParametricPlot3D[surface[x,y], {x, 0, 1}, {y, 0, 1},
MaxRecursion->4,Axes->None,Mesh->All,Boxed->False]
Run Code Online (Sandbox Code Playgroud)
现在我们可以看到结构了。但问题是我想制作一个 3D 实体,而这个结构实际上有两个可见的孔。

在下一张图片中,我们可以看到两个角落都是开放的,结构不是实心的而是空心的。

所以我想出了一个解决方案,我确信它可以在视觉上工作,但不会返回一个坚实的结构。
pic=Show[Graphics3D[
{Polygon[Table[surface[0,y],{y,0,1,0.005}]],
Polygon[Table[surface[1,y],{y,0,1,.005}]]}],
ParametricPlot3D[surface[x,y],{x,0,1},{y,0,1},
MaxRecursion-> 4,PlotPoints-> 20,
Mesh-> All],Boxed->False,Axes-> None];
Run Code Online (Sandbox Code Playgroud)
GraphicsGrid[ {{ParametricPlot3D[surface[x,y],{x,0,1},{y,0,1}, PlotPoints-> 20,Mesh-> All,Boxed->False,Axes-> None], Graphics3D[{Polygon[Table[surface[0,y],{y,0,1,0.005}]],Polygon[Table[surface[1,y],{y,0,1,.005}]]} ], 图片}}]
这是输出。

现在我们将孔在视觉上闭合的第三张图片导出为 *.obj 文件。我们可以在任何基于 CAD 的网格编辑器(如Meshlab )中导入该文件。在那里可以看到要检测的孔。

现在有一种简单的方法可以让我们在 Mathematica 中使用Foil.mat文件中的给定数据点形成实体结构。我希望BSpline函数中可能有一些选项可以实现这一点。正如人们所料,我想要一个没有孔的封闭表面。
希望我已经能够足够明确地解释我的问题。将等待您的回复。
BR
这是一组结构化的3D点.现在我们可以形成一个BSpline使用这些点作为结.
dat=Import["3DFoil.mat", "Data"]
fu=BSplineFunction[dat]
Run Code Online (Sandbox Code Playgroud)
在这里,我们可以ParametricPlot3D用这些点来做.
pic=ParametricPlot3D[fu[u,v],{u, 0, 1}, {v, 0, 1}, Mesh -> All, AspectRatio ->
Automatic,PlotPoints->10,Boxed-> False,Axes-> False]
Run Code Online (Sandbox Code Playgroud)

题
如果我们仔细观察从样条曲线出来的3D几何体,我们可以看到它是一个中空结构.该孔出现在对称轮廓的两侧.我们怎样才能完美地(不是视觉上!)填满这个洞并创建一个统一的Graphics3D物体,在那里两侧的孔被修补.

到目前为止我能得到的是以下内容.孔没有完全修补.

我最近问了太多问题而且我很抱歉.但是,如果你们中的任何一个有兴趣,我希望你能提供帮助
更新
这是belisarius方法的问题.它生成的三角形几乎可以忽略不计.
dat = Import[NotebookDirectory[] <> "/3DFoil.mat", "Data"];
(*With your points in "dat"*)
fd = First@Dimensions@dat;
check = ParametricPlot3D[{BSplineFunction[dat][u, v],
BSplineFunction[{dat[[1]], Reverse@dat[[1]]}][u, v],
BSplineFunction[{dat[[fd]], Reverse@dat[[fd]]}][u, v]}, {u, 0,
1}, {v, 0, 1}, Mesh -> All, AspectRatio -> Automatic,
PlotPoints -> 10, Boxed -> False, Axes -> False] …Run Code Online (Sandbox Code Playgroud)