【问题标题】:MATLAB: Using an anonymous function within symsum, then fsolveMATLAB:在 symsum 中使用匿名函数,然后 fsolve
【发布时间】:2016-03-30 17:16:03
【问题描述】:

在 MATLAB 中,我希望定义一个匿名函数,其中有一个确定的总和,以及另一个匿名函数。这是一个 MWE,希望能描述我正在尝试做的事情:

clear; n=1; syms j; a=0; b=sqrt(0.5);
Finv = @(x) logninv(x,a,b);
fun = @(x) 0.5-symsum(Finv(j*x), j, 1, n+1);
fsolve(fun,0.1)

返回的错误是:

使用 symfun 时出错>validateArgNames(第 211 行)第二个输入必须是 唯一符号变量的标量或向量。

symfun 中的错误(第 45 行) y.vars = validateArgNames(inputs);

sym/subsasgn 中的错误(第 762 行) C = symfun(B,[inds{:}]);

logninv 中的错误(第 60 行)p(p

@(x)logninv(x,a,b) 中的错误

@(x)0.5-symsum(Finv(j*x),j,1,n+1) 中的错误

fsolve 中的错误(第 217 行) fuser = feval(funfcn{3},x,varargin{:});

原因: 初始用户提供的目标函数评估失败。 FSOLVE 不能 继续。

对于Finv 的这个特殊选择,我使用evalfeval 解决了它,如下所示:

clear; n=1; syms j; a=0; b=sqrt(0.5);
Finv = @(x) logninv(x,a,b);
fun = @(x) 0.5-eval(symsum(feval(symengine,'logninv',j*x,a,b), j, 1, n+1));
fsolve(fun,0.1)

在这种特殊情况下会产生答案,因为Finv=@(x) logninv(x,a,b),但这违背了重点,即我希望能够将Finv定义为我选择的单变量函数,不一定是预定义的MuPAD表达式'logninv'.

任何建议将不胜感激。

【问题讨论】:

  • 有什么理由使用符号数学吗?使用 sum 而不是 symsum
  • 啊!你说的对。这很容易解决:fun = @(x) 0.5-sum(Finv([1:n+1]*x)); 谢谢。

标签: matlab anonymous-function symbolic-math mupad


【解决方案1】:

尝试将第二个变量(即 j)强制为具有标量(数值)数据类型的符号变量。请注意,在他的代码中,只有变量没有被初始化。

clear; n=1; syms j integer; a=0; b=sqrt(0.5);

或者,您可以检查每个变量的假设。例如,

assumptions(j)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 2015-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多