2

我目前正在编写一个模块,该模块应该获取二维函数的一些数据点(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}]

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

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

fitFunc = Fit[dataPoints, functionList, fittingVarsList];

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

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

这会导致错误:

ContourPlot::write: {x,y}[[1]] 中的标记部分受保护。Show::gcomb: "无法合并 Show[ContourPlot[fitFunc$2187,{{x,y}[[1]],xMin,xMax},{{x,y}[[2]],yMin 中的图形对象,yMax}]"

我究竟做错了什么?

4

1 回答 1

3

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

Attributes@ContourPlot

在此处输入图像描述

你可以像这样修复它。

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}]

在此处输入图像描述

这重现了问题:-

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

在此处输入图像描述

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

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

在此处输入图像描述

如果您HoldAll从第一个版本的属性中删除ContourPlot作品...

Unprotect@ContourPlot;
ClearAttributes[ContourPlot, HoldAll]

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

于 2013-06-26T11:19:40.973 回答