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)空のシンボリック行列を返す場合は問題ありません)。呼び出したときに 2 番目のエラーが発生するという事実は、それが実際にはまだ未知の変数を含む式であるdoubleことを暗示しているようです。substこの場合、他の変数に代入するか、仮定 (ここを参照) を使用して、行っているように論理比較を行う必要があります。

于 2013-06-02T23:02:27.100 に答える