2011-11-17 20 views
8

Áp dụng Orthogonalize[] một lần:Orthogonalize [] làm việc như mong đợi chỉ khi áp dụng hai lần

v1 = PolyhedronData["Dodecahedron", "VertexCoordinates"][[1]]; 
Graphics3D[Line[{{0, 0, 0}, #}] & /@ 
    Orthogonalize[{a, b, c} /. 
    FindInstance[{a, b, c}.v1 == 0 && ([email protected] != 0.||[email protected] != 0.||[email protected] != 0.), 
    {a, b, c}, Reals, 4]], Boxed -> False] 

enter image description here

Và bây giờ hai lần:

Graphics3D[Line[{{0, 0, 0}, #}] & /@ 
    [email protected][{a, b, c} /. 
    FindInstance[{a, b, c}.v1 == 0 && ([email protected] != 0.||[email protected] != 0.||[email protected] != 0.), 
    {a, b, c}, Reals, 4]], Boxed -> False] 

enter image description here

Errr ... Tại sao ?

+0

Vì vậy, [Szabolcs] (http://stackoverflow.com/questions/8154079/add-text-to-faces-of-polyhedron/8155008#comment10011483_8155008) nhận được một lời chúc mừng, nhưng tôi không?!? : D – rcollyer

+0

Hmmm, chạy một recalc, và nó đã không hoạt động như tôi mong đợi. Dưới 5k, một lần nữa. – rcollyer

+0

@rcollyer Congrats !! : D Tôi đã ra ngoài ăn ;-) – Szabolcs

Trả lời

4

Tôi cũng cho rằng nó sẽ là một số lỗi, nhưng không hoàn toàn hiểu được lý do tại sao , vì vậy tôi cố gắng thực hiện Gram-Schmidt orthogonalization bản thân mình, với hy vọng sẽ hiểu được những vấn đề trên đường:

(* projects onto a unit vector *) 
proj[u_][v_] := (u.v) u 

Clear[gm, gramSchmidt] 

gm[finished_, {next_, rest___}] := 
With[{v = next - Plus @@ Through[(proj /@ finished)[next]]}, 
    gm[Append[finished, [email protected][v]], {rest}] 
] 

gm[finished_, {}] := finished 

gramSchmidt[vectors_] := gm[{}, vectors] 

(Chỉ để minh họa, tôi đơn giản là không thể hiểu được những gì đang diễn ra trước khi tôi tự mình thực hiện lại.)

Bước quan trọng ở đây, mà trước đây tôi chưa nhận ra là không hoặc không trước bước chuẩn hóa (xem Chop trong mã của tôi). Nếu không, chúng ta có thể nhận được một cái gì đó nhỏ bé, có thể là một lỗi số, mà sau đó được chuẩn hóa trở lại thành một giá trị lớn.

Điều này dường như được kiểm soát bởi tùy chọn ToleranceOrthogonalize, và thực sự, tăng khả năng chịu đựng và buộc nó loại bỏ vectơ nhỏ khắc phục sự cố bạn mô tả. Orthogonalize[ ... , Tolerance -> 1*^-10] hoạt động trong một bước.

+0

Tôi nghĩ bạn nói đúng. Sử dụng mã của bạn có và không có 'Chop' trong' FindInstance' mang lại cho tôi hai mặt phẳng có chỉ số khác nhau bằng dấu. Tôi nhận được điều tương tự bằng cách sử dụng 'Orthogonalize' với' Tolerance -> 10^-10'. – rcollyer

1

Có lẽ nó là một đặc tính của phương pháp mặc định GramSchmidt?

Thử: Method -> "Reorthogonalization" hoặc Method -> "Householder".

+0

Mặc định thực sự là "ModifiedGramSchmidt". Chỉ là một quan sát sau khi chơi với nó. – Szabolcs

+0

Tôi nghĩ rằng đó là một lỗi số do sử dụng 'Chop' của anh ta, như không có nó, bạn chỉ nhận được 2 véc tơ khác 0. – rcollyer

6

Tôi nghĩ rằng kết quả đầu tiên là do lỗi số học, lấy

sys = {a,b,c}/.FindInstance[ 
      {a, b, c}.v1 == 0 && ([email protected] != 0. || [email protected] != 0. || [email protected] !=0.), 
      {a, b, c}, Reals, 4]; 

sau đó [email protected] returns 2, do hệ thống chính nó chỉ là hai chiều. Với tôi, điều này ngụ ý rằng trường hợp đầu tiên của Orthogonalize là tạo ra một lỗi số, và trường hợp thứ hai đang sử dụng lỗi máy bay để cung cấp cho bạn ba vectơ của bạn. Loại bỏ các Chop điều kiện sửa chữa này,

Orthogonalize[{a, b, c} /. 
    [email protected][{a, b, c}.v1 == 0,{a, b, c}, Reals, 4]] 

nơi N là cần thiết để thoát khỏi các Root thuật ngữ xuất hiện. Điều này mang lại cho bạn một hệ thống hai chiều, nhưng bạn có thể nhận được một phần ba bằng cách lấy sản phẩm chéo.

Chỉnh sửa: Dưới đây là bằng chứng nữa là lỗi số do Chop.

Với Chop, FindInstance mang lại cho tôi

{{64., 3.6, 335.108}, {-67., -4.3, -350.817}, {0, 176., 0}, 
{-2., -4.3, -10.4721}} 

Without Chop, tôi nhận được

{{-16.8, 3.9, -87.9659}, {6.6, -1.7, 34.558}, {13.4, -4.3, 70.1633}, 
{19.9, -4.3, 104.198}} 

đó là một sự khác biệt đáng kể giữa hai người.

+0

Điều này cũng có thể được chữa khỏi bằng cách áp dụng 'Normalize/@' trước khi trực giao – Szabolcs

+0

@ Szabolcs, ít nhất là trên hệ thống của tôi, nó không, và tôi sẽ không mong đợi nó như các lỗi số vẫn còn. – rcollyer

+0

Tôi đang sử dụng Windows 32 bit, 8.0.4, 'Chỉnh sửa [Chuẩn hóa/@ (...)] 'sửa lỗi ở đây. Các vectơ tôi nhận được từ FindInstance giống như trên máy của bạn. – Szabolcs

Các vấn đề liên quan