好的,我正在尝试在TI-NSpire中创建一个交叉乘积函数,该函数采用n维向量的n,并采用这样的矩阵的行列式:
[[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个未定义的局部变量列表,我可以设置为单位向量计算完成。
我的问题是,如果可能的话,如何执行第二个选项?
编辑代码:(注意:这当前正在使用我提到的变量列表。不幸的是,这个问题是“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
答案 0 :(得分:2)
在NSpire中,矩阵的元素必须是标量。
这意味着两件事:
1) `[i, j, k, l]` must be written `augment(i,augment(j,augment(k,l)))`
2) the output of det is a scalar
最后一个对你来说最麻烦。它基本上意味着如果你想使用你的方法,你需要编写自己的det
版本。
现在问题的第二部分是如何为任意维度实现这一点。令人遗憾的是,NSpire中的“编程语言”非常有限。第一个复杂因素是扩充不处理任意数量的参数。
相反,你需要编写一个augment_from_list(vectors)
,它接受一个参数(一个向量列表)并对它们进行扩充。
这只是为了增强 - 你需要类似的帮助器来扩展内置函数来处理任意数量的参数。
答案 1 :(得分: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
我似乎偶然发现了一些矢量,其中唯一的矢量垂直于所有三个(&lt; 1,2,3,4&gt;,&lt; 5,6,7,8&gt;,&lt; 9,10,11 ,12>)是&lt; 0,0,0,0&gt;。但是,如果有人能证实这一点,我将非常感激。
由于计算器处理多项式的方式,这整个函数都有效。所以我的单位&#39;函数中的向量是1,单位,单位^ 2,单位^ 3等。因此,一旦它确定了“单位”的系数。变量是向量的组成部分。另外,在测试过程中,我发现如果行列式导致零乘以多名义的前导幂(比如单位^ 3)那么向量将是一个组件的短(但如果0乘以任何较低权力的条款,但没有领先的权力,没有问题)。如果行列式结果为0,则结果只是一个空列表。带有嵌套for循环的if循环通过确保每个组件都在适当长度的列表中来处理这个问题(从而防止混淆并导致执行程序必须做额外的工作才能返回到正确的列表长度并且那些组件在正确的位置。
我确信代码可以改进并加快速度,但我对结果感到满意。感谢大家的帮助。