“(......)中的标签部分受到保护”

时间:2013-06-25 21:11:54

标签: wolfram-mathematica

我目前正在编写一个模块,该模块应该采用二维函数的一些数据点(一个3 x N矩阵),并根据这些点绘制近似的等高线图(用户提供拟合的函数和变量)。 “标题”看起来像这样:

project4[dataPoints_, functionList_, fittingVarsList_, plotArgs___] := 
 Module[{fitFunc, functionContourPlot, dataPointsXY, pointsPlot, 
   xList, yList},

使用示例:

project4[data, {1, x, y, x y, x^2, y^2}, {x, y}]

(其中data = {{x1,y1,f1} ...})

在检查参数是否有效后,我会这样做:

fitFunc = Fit[dataPoints, functionList, fittingVarsList];

获得近似值。 然后我想通过这样做获得它的情节:

functionContourPlot = ContourPlot[fitFunc, {fittingVarsList[[1]], xMin, xMax},{fittingVarsList[[2]],yMin, yMax};

导致错误:

  

ContourPlot :: write:{x,y} [[1]]中的标记部分受保护。显示:: gcomb:   “无法合并图形对象   显示[ContourPlot [fitFunc $ 2187 {{X,Y} [[1]],XMIN,XMAX},{{X,Y} [[2]],YMIN,YMAX}],“

我做错了什么?

1 个答案:

答案 0 :(得分:3)

问题是ContourPlot具有属性HoldAll,这会阻止Part评估。

Attributes@ContourPlot

enter image description here

您可以像这样修复它。

data = {{6, 4, 7.92}, {6, 5, 9.31}, {6, 6, 9.74},
   {7, 4, 11.24}, {7, 5, 12.09}, {7, 6, 12.62},
   {8, 4, 14.31}, {8, 5, 14.58}, {8, 6, 16.16}};

fittingVarsList = {x, y};
{xMin, xMax} = Through[{Min, Max}@data[[All, 1]]];
{yMin, yMax} = Through[{Min, Max}@data[[All, 2]]];

fitFunc = Fit[data, {1, x, y}, {x, y}]

enter image description here

这再现了问题: -

functionContourPlot = ContourPlot[fitFunc,
   {fittingVarsList[[1]], xMin, xMax},
   {fittingVarsList[[2]], yMin, yMax}];

enter image description here

使用With创建局部变量可以解决问题: -

functionContourPlot = 
 With[{a = fittingVarsList[[1]], b = fittingVarsList[[2]]},
  ContourPlot[fitFunc, {a, xMin, xMax}, {b, yMin, yMax}]]

enter image description here

如果您从HoldAll的属性中移除ContourPlot,则第一个版本可以正常运行...

Unprotect@ContourPlot;
ClearAttributes[ContourPlot, HoldAll]

......但这将是鲁莽的编程。