1. ホーム
  2. matlab

[解決済み] MATLAB: symからlogicalへの変換ができない

2022-02-02 08:50:59

質問

ここで作成しているユーザー定義関数で問題が発生しています。私がやろうとしていることは、ある値を記号関数に代入し、その数値の答えを様々な目的で使用することです。具体的にはここです。

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

何が間違っているのか、ご指摘いただけると幸いです。

どのように解決するのですか?

でやろうとしていることは 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 は、実際にはまだ未知の変数を含む式です。もしそうであれば、他の変数で代用するか、仮定を使う必要があります ( こちら のように、論理比較を行うことができます。