0

我在这里构建的用户定义函数有问题。我要做的是将一个值替换为一个符号函数,然后将该数字答案用于各种目的。具体在这里:

x = xo;
subst = subs(f,x);
while((n>i) && (subst > eps))

运行我的程序,我收到以下错误:

>> sym_newtonRaphson(f,fdiff,1,1e-8,10)
Conversion to logical from sym is not possible.

Error in sym_newtonRaphson (line 8)

我试过用double(subs(f,x))没用。我似乎遇到了与 MuPAD ( DOUBLE cannot convert the input expression into a double array.)相关的完全不同的错误

以下是整个程序:

function [output] = sym_newtonRaphson(f,fdiff,xo,eps,n)

i = 0;
%initial iteration
x = xo;
subst = subs(f,x);

  while((n>i) && (subst > eps))
     x = x - (subs(f,x))/fdiff;
     i = i+1;
     subst = subs(f,x);
     %fprintf('%f\t%f\t%f\t%f\t%f\t%f',i,alpha,f(
  end
  output = x;
end

我会很感激一些关于我做错了什么的指示;一切顺利。

4

1 回答 1

1

您尝试对while表达式执行的操作等效于logical(f),其中f是符号函数(而不是符号值)。logical(sym('exp(1)') > 0)很好,但logical(sym('exp(f)') > 0)通常不会(请参阅 参考资料assume)。Matlab 无法将符号变量转换为逻辑(真假)变量。它尝试这样做是因为符号变量不支持短路AND运算符, 。&&例如

a = 1.5;
syms x;

% All of these will not generate errors
y1 = x > 1;
y2 = x > 1 & x < 2;
y3 = x > 1 & x < 2;
y4 = x > 1 & a < 2;
y5 = x > 1 & a > 2;

% These will result in errors
y2 = x > 1 && x < 2;
y3 = x > 1 && x < 2;
y4 = x > 1 && a < 2;
y5 = x > 1 && a > 2;

您应该打印出来subst并确保它是一个符号值或一个不包含任何变量的函数(如果argnames(subst)返回一个空符号矩阵,那么您应该没问题)。调用时出现第二个错误的事实double似乎暗示这subst实际上是一个仍然包含未知变量的表达式。如果是这种情况,那么您要么需要替换其他变量,要么使用假设(请参阅此处),以便按照您的操作进行逻辑比较。

于 2013-06-02T23:02:27.100 回答