MATLAB:无法从sym转换为逻辑

MATLAB:无法从sym转换为逻辑,matlab,newtons-method,Matlab,Newtons Method,我在这里构造的用户定义函数有问题。我想做的是将一个值替换成一个符号函数,然后将这个数字答案用于各种目的。具体而言: 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

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

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无法将输入表达式转换为双数组。

以下是整个计划:

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

我希望有人能指点我做错了什么;祝你一切顺利

while表达式与
逻辑(f)
等价,其中
f
是一个符号函数(而不是符号值)<代码>逻辑(sym('exp(1))>0)可以,但
逻辑(sym('exp(f))>0)
通常不会(请参阅)。Matlab无法将符号变量转换为逻辑变量(真和假)。它尝试这样做是因为符号变量不支持,
&&
。比如说

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;
a=1.5;
符号x;
%所有这些都不会产生错误
y1=x>1;
y2=x>1&x<2;
y3=x>1&x<2;
y4=x>1&a<2;
y5=x>1&a>2;
%这些将导致错误
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
实际上是一个仍然包含未知变量的表达式。如果是这种情况,则需要替换其他变量或使用假设(),以便在进行逻辑比较时。

FYI。看起来您正在作为参数传递给函数
eps
,是一个内置常量(和函数),可在Matlab中的任何位置使用。您不需要传入它,通常最好避免使用与常见内置函数名匹配的变量名(尽管我不在乎人们怎么说)。如果愿意,为函数创建一个名为
tol
的参数,并将其设置为
eps
1e-8
。我在这里使用epsilon作为必须输入的容差值,但感谢您提供的提示。如果我们知道
f
xo
的样子,请尝试使用
eval
而不是
subs
,我们可以更好地了解发生了什么。那就是:
f=8-4.5*(x-sin(x))
xo
就是我在这里展示的1。