我遇到了我在这里构建的用户定义函数的问题。我想要做的是将值替换为符号函数,然后将该数字答案用于各种目的。具体在这里:
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
我很欣赏一些关于我做错事的指示;祝一切顺利。
答案 0 :(得分:1)
您尝试对while
表达式执行的操作等同于logical(f)
,其中f
是符号函数(而不是符号值)。 logical(sym('exp(1)') > 0)
很好,但logical(sym('exp(f)') > 0)
通常不会出现(参见assume
)。 Matlab无法将符号变量转换为逻辑(真和假)变量。它尝试执行此操作,因为符号变量不支持short circuit AND
operator,&&
。例如
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
实际上是一个仍然包含未知变量的表达式。如果是这种情况,那么您需要替换其他变量或使用假设(see here)才能进行逻辑比较。