2

現在、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

問題は、評価を妨げるContourPlotattribute を持っていることです。HoldAllPart

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 に答える