2017-09-08 6 views
1

実際の問題を単純化するために、以下の記号式を定義しましょう。私は何とかaに新しいものを割り当てた場合シンボリック配列が更新されると、最初の配列の要素を使用する別の変数をもう更新できません

a=sym('a',[1,3]); 
b=a(1); 

、私はbを更新することができません。これを行う正しい方法は何ですか?

例1:

a=sym('a',[1,3]); 
b=a(1); 
a=sym([1,2,3]); 
b 
subs(b) 
subs(b,a(1),100) 

例1つの出力:

b = 

a1 


ans = 

a1 


ans = 

a1 

例2:

a=sym('a',[1,3]); 
b=a(1); 
a=subs(a,a(1),3); 
b 
subs(b) 
subs(b,a(1),100) 

例2出力:

b = 

a1 


ans = 

a1 


ans = 

a1 

例3:

a=sym('a',[1,3]); 
b=a(1); 
a(1)=sym(3); 
b 
subs(b) 
subs(b,a(1),100) 

例3出力:

b = 

a1 


ans = 

a1 


ans = 

a1 

私の実際の問題は、以下のとおりです。私はNの未知数

a=sym('a',[1,N]); 

N方程式を持っています。

EQN=sym('EQN',[1,N]); 

Nは、ユーザの入力に応じて定義されており、私はそれが事前にどうなるかわかりません。私はaに依存する他の変数も持っています。

% some code here such as b = [2*a(1),3*a(2),..] etc. 

その後、私は今、私はbでの未知数を取り除くしたいが、私はのためにできない未知の

% some code here to derive EQN(1), EQN(2), ... EQN(N). 
SOL=solve(EQN,a); 

のための方程式を解くと

SOL = struct2cell(SOL); 
SOL = [SOL{:}]; 
a=subs('a',a,SOL); 

にソリューションを代用私が最初に説明しようとした理由。

+0

'subs(b、SOL)'についてはどうですか? – m7913d

+0

@ m7913d 'SOL'が' [3,2,1] 'になったと仮定して、例2の最後に' subs(b、[3,2,1]) 'を書き、その行の出力は'[3、2、1]'。私はそれが「3」だけであると予想した。 –

+0

私は 'solve'関数によって返される' SOL'を意味します。これは構造体 'subs(b、solve(EQN、a))'です。 – m7913d

答えて

0

a1,a2およびa3に新しい値を割り当てる代わりに、aを上書きしてしまうという問題があります。したがって、aの代わりに、基になる変数を変更する必要があります。

a=sym('a',[1,3]); 
b = a(1) 
a1 = 1; 
subs(b) % returns 1 
subs(b, 'a1', a1) % returns 1 
subs(a) % [ 1, a2, a3] 

あなたがsolve操作の結果を代用するためにそれを使用したい場合は、最善の解決策はsubs with the output structure of solve as inputを使用することです:次のように手動でもこのような構造を構築することができ

sol = solve(a == [1 2 3], a); 
subs(b, sol) % returns 1 

注:

sol.(char(a(1))) = 1 % sol.a1 = 1; 
+0

はい、そうです。私が 'a = sym( 'a'、[1、N])'を使用している理由は、 'eval([syms a '、num2str(i)])'内部のループには使用しないことです。しかし、あなたは 'eval'を完全に取り除くことはできないようです。 'N'が変わるので、私が割り当てる添字が変わることに注意してください。私はコード内で 'ai = 1'の' i'を動的に変更できるはずです。 eval(['a'、num2str(i)、 '= 1']) ')を使わずにコード' a1 = 1'を評価する方法はありますか? –

+0

@UtkuTürer私の記事の最後に 'eval'を避ける方法を追加しました。 – m7913d

関連する問題