1

ベクトル値のシンボリック関数が線形かどうかを確認する簡単な方法はありますか? もしそうなら、この式を の形A*xで表現する簡単な方法はありAますか?xAxA*x

syms x1 x2 a b c;
fx1 = [a*(x1+x2); b*x1+c*x1];
fx2 = [a*x1/log(x2); x2^2];
A=checklinearity(fx1, [x1 x2]') % should return [a, a; b+c, 0]
A=checklinearity(fx2, [x1 x2]') % should return false

回答: 組み込みの MATLAB関数EquationsToMatrix を使用して問題を解決する簡単な方法があります。

4

2 に答える 2

1

あなたの質問は、方程式が問題の変数で線形である多項式であるかどうかを効果的に尋ねています。MuPADには、多項式代数に使用できる一連の関数があります。たとえば、degree関数を使用できます。map関数を使用して関数のリストをベクトル化する例を次に示します。

function p = orderOfVars(f,x)
for i = numel(x):-1:1
    p(:,i) = evalin(symengine,['map(' char(f(:)) ',f->degree(f,' char(x(i)) '))']);
end

それで

syms x1 x2 a b c;
fx1 = [a*(x1+x2); b*x1+c*x1];
fx2 = [a*x1/log(x2); x2^2];

y1 = orderOfVars(fx1,[x1 x2])
y2 = orderOfVars(fx2,[x1 x2])

戻り値

y1 =

[ 1, 1]
[ 1, 0]


y2 =

[ 1, 0]
[ 0, 2]

ここからは、値をテストするだけです。

all(y1(:)<=1)
all(y2(:)<=1)

それぞれ true と false を返します。

于 2014-08-26T12:58:33.603 に答える
0

私は自分の答えを投稿して受け入れることにしました。

一般に、正しい解決策につながるいくつかのアプローチがあります。

1)。最も簡単な解決策は、組み込みの MATLAB 関数 を使用することequationsToMatrix()です。関数は線形性をテストし、式が非線形である場合、関数は識別子で例外をスローしますsymbolic:sym:equationsToMatrix:NonlinearSystem。システムが線形の場合、関数は目的の行列を返します。

2)。patrik によって提案された解決策は、線形性の定義を使用することでした: f(ax)-a*f(x)。これは線形性をテストするだけですが、システムが線形であることが確認されれば、行列を推測することは難しくありません。

3)。horchler によって提案された解決策は、多項式代数を使用することでした。

于 2014-08-26T11:23:26.650 に答える