使用For循环时Set :: write错误

时间:2013-12-01 14:41:43

标签: wolfram-mathematica mathematica-7

解决复杂的公式f(u,v)==0,其中

我为 u 分配一些常量值,然后解决 v

可以解决没有 for循环,但是通过添加For[]包含代码来遇到错误,

在哪里说

Set::write: Tag Times in "Solve[] with exact coefficients solns is Protected.

一个简单的例子来说明我的想法:

  For[  i = 1, i < 5, i++,

        f = x^2 + y^2 - 10;
        x = i;
        eqn = (f == 0);
        soln = Solve[eqn, y]

     ]

会收到错误:

Set::write: "Tag Times in (-9+y^2) is Protected."
当我在代码外部添加[]时,

(内部4行代码在没有for循环的情况下正常工作)

所以似乎for循环中存在变量赋值权限问题

我该如何避免呢?

1 个答案:

答案 0 :(得分:0)

我不再安装Mathematica 7,并且您的代码在Mathematica 10上运行(尽管没有打印输出......)根据错误消息,在尝试重新分配之前,您需要Clear[f]

For[i = 1, i < 5, i++,
 Clear[f];
 f = x^2 + y^2 - 10;
 x = i;
 eqn = (f == 0);
 soln = Solve[eqn, y];
 Print[soln]
]

然而,你仍然在混淆。考虑循环执行时代码会发生什么。首先,它从i = 1开始并说:

  • Clear[f] - 或者不是,这不是唯一的问题
  • f = x^2 + y^2 - 10 - 这给了我一个带有符号xy
  • 的表达式
  • x=i - 自x=1已经
  • 以来设置i=1

此时, f的表达式变为y ^ 2 - 9` 。下次它会出现,它将重复:

  • f = x^2 + y^2 - 10 - 但x不再是符号!!所以现在它仍然对待x=1 ...

这成了一场噩梦。我可以尝试破解你的代码以处理最少的更改(例如,使其成为Clear[f,x]或其他东西),但这不是我能给出的最佳建议。

更好的整体构造将是:

Eqn[x_,y_]=(x^2+y^2-10==0);
For[i=1,i<5,i++,
 Print[Solve[Eqn[i,y],y]];
];

您的函数f是一个函数,因此您应该使它成为f[x_,y_]=something之类的函数。更好的是,只需将整个方程式转换为上述函数即可。这样,您实际上永远不会修改xy的值,也不会在循环中遇到问题。

在你使用我给你的新代码之前,清除所有内容或者只是退出内核。