2

わかりました、TI-NSpire で外積関数を作成しようとしています。これは次元 n の n-1 ベクトルを取り、次のような行列の行列式を取ります。

[[u_x,u_y,u_z,u_w],
 [a_1,a_2,a_3,a_4],
 [b_1,b_2,b_3,b_4],
 [c_1,c_2,c_3,c_4]]

一番上の行は、軸の方向を向いた単位ベクトルです。残念ながら、計算機に未定義の変数を与えない限り、u_x、u_y... などのいずれかがベクトルであり、行列が適切な行列ではないか、ベクトルが値であり、行列式はベクトルではなく単一の値になります。ただし、私ができることは、単位ベクトルを未定義のままにして行列式を実行し、行列式が完了した後に変数を定義することです。

私が残したのは、自分自身を最大ベクトルサイズに制限するか (不合理ではありませんが、これを使用したくない)、計算が完了した後に単位ベクトルに設定できる n 個の未定義のローカル変数のリストを動的に作成することです。 .

私の質問は、可能であれば、2 番目のオプションをどのように実行しますか?

コードの編集:(注:これは現在、私が言及した変数のリストを使用しています。残念ながら、これの問題は「5→{a、b、c、d} [1,2]」エラーです。)

Define LibPub cross_p(mat)=
Func
:Local i_,n_,unit_v,unit_list
:Local dim_v,num_v,len_v,new_v
:Local det_v
:[a,b,c,d,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]→unit_list
:dim(mat)→dim_v
:dim_v[1]→num_v
:dim_v[2]→len_v
:newMat(len_v,len_v)→unit_v
:For n_,1,len_v
:  1→unit_v[n_,n_]
:EndFor
:If num_v=len_v-1 Then
:  newMat(len_v,len_v)→new_v
:  subMat(unit_list,1,1,1,len_v)→new_v[1]
:  For i_,1,num_v
:    mat[i_]→new_v[i_+1]
:  EndFor
:  det(new_v)→det_v
:  For i_,1,len_v
:    unit_v[i_]→unit_list[1,i_]
:  EndFor
:  Return det_v
:EndIf
:EndFunc
4

2 に答える 2

2

NSpire では、行列の要素はスカラーでなければなりません。

これは、次の 2 つのことを意味します。

 1)  `[i, j, k, l]` must be written `augment(i,augment(j,augment(k,l)))`

 2)  the output of det is a scalar

最後はあなたにとって最も面倒です。基本的に、独自のアプローチを使用する場合は、独自のバージョンを作成する必要があることを意味しますdet

問題の 2 番目の部分は、任意の次元に対してこれを実装する方法です。悲しいことに、NSpire の「プログラミング言語」は非常に限られています。最初の問題は、augment が任意の数の引数を処理しないことです。

augment_from_list(vectors)代わりに、 1 つの引数 (ベクトルのリスト) を取り、それらを拡張するa を記述する必要があります。

そして、これは単なる拡張用です。任意の数の引数を処理するように組み込み関数を拡張するには、同様のヘルパーが必要になります。

于 2015-09-04T10:28:45.030 に答える
1

OPはこちら。私が思いついた解決策は、単純な更新ではなく、適切な対応に適していると感じました。

Define LibPub v_crossp(v_list)=
Func
:Local i,num_v,new_v,det_v,vec,v_coeff,n_coeff
:dim(v_list)[2]→num_v
:newMat(num_v,num_v)→new_v
:newList(num_v)→vec
:For i,1,num_v
:unit^(i-1)→new_v[1,num_v+1-i]
:EndFor
:For i,1,num_v-1
:  v_list[i]→new_v[i+1]
:EndFor
:det(new_v)→det_v
:polyCoeffs(det_v,unit)→v_coeff
:dim(v_coeff)→n_coeff
:If n_coeff<num_v Then
:  listoperations\reverselist(v_coeff)→v_coeff
:  For i,1,n_coeff
:    v_coeff[i]→vec[i]
:  EndFor
:  listoperations\reverselist(vec)→vec
:  Return vec
:Else
:  Return v_coeff
:EndIf
:Return new_v
:Return expand(det_v)
:EndFunc

実際、この機能は非常にうまく機能します。関数 reverselist() は、単にリストを反転します。コードは簡単です。

Define LibPub reverselist(list)=
Func
:Local i,size,l_new
:size:=dim(list)
:l_new:=newList(size)
:For i,1,size
:  list[i]→l_new[size+1-i]
:EndFor
:Return l_new
:EndFunc

また、3 つすべて (<1,2,3,4>、<5,6,7,8>、<9,10,11,12>) に垂直な唯一のベクトルが < 0,0,0,0>. しかし、誰かがそれを確認できるなら、私はそれを大いに感謝します.

この関数全体が機能するのは、電卓が多項式を処理する方法のためです。したがって、関数内の「単位」ベクトルは、1、単位、単位^2、単位^3などです。したがって、行列式を実行すると、「単位」変数の係数はベクトルのコンポーネントになります。さらに、テストの過程で、行列式の結果がゼロに多項式 (単位 ^3 など) を乗じた結果になる場合、ベクトルは短いコンポーネントになることがわかりました (ただし、0 に任意のより低いべき乗の項の、しかし主要なべき乗ではなく、問題はありませんでした)。行列式の結果が 0 の場合、結果は単なる空のリストでした。

コードを改善して高速化できると確信していますが、結果には満足しています。みんなの助けに感謝します。

于 2015-09-30T01:09:07.757 に答える