2011-06-28 39 views
5

Về cơ bản, tôi đang cố gắng tìm giá trị riêng cho ma trận và mất khoảng 12 giờ. Khi nó kết thúc, nó nói rằng nó không thể tìm thấy tất cả các eigenvectors (thực sự hầu như không có), và tôi hoài nghi về những người nó đã tìm thấy. Tất cả những gì tôi thực sự có thể làm là đăng mã của tôi, và tôi hy vọng rằng ai đó có thể đưa ra một số gợi ý cho tôi. Tôi không có kinh nghiệm với toán học và có thể là thời gian chạy chậm và kết quả xấu có liên quan đến tôi chứ không phải khả năng toán học. Nhờ bất cứ ai trả lời, tôi thực sự đánh giá cao nó.Vấn đề với giá trị điện toán tính toán bằng cách sử dụng toán học

cutoff = 500; (* set a cutoff for the infinite series *) 
numStates = cutoff + 1; (* set the number of excited states to be printed *) 
If[numStates > 10, numStates = 10]; 

    $RecursionLimit = cutoff + 256; (* Increase the recursion limit to allow for the specified cutoff *) 
(* set the mass of the constituent quarks *) 
m1 := mS; (* just supposed to be a constant *) 
m2 := 0; 

(* construct the hamiltonian *) 
h0[n_,m_] := 4 Min[n,m] * ((-1)^(n+m) * m1^2 + m2^2); 

v[0,m_] := 0; 
v[n_,0] := 0; 
v[n_,1] := (8/n) * ((1 + (-1)^(n + 1))/2); 
v[n_,m_] := v[n - 1, m - 1] * (m/(m - 1)) + (8 m/(n + m - 1))*((1 + (-1)^(n + m))/2); 

h[n_,m_] := h0[n,m] + v[n,m]; 

(* construct the matrix from the hamiltonian *) 
mat = Table[h[n,m], {n, 0, cutoff}, {m, 0, cutoff}] // FullSimplify; 

(* find the eigenvalues and eigenvectors, then reverse the order *) 
PrintTemporary["Finding the eigenvalues"]; 
{vals, vecs} = Eigensystem[N[mat]] // FullSimplify; 

$RecursionLimit = 256; (* Put the recursion limit back to the default *) 

Có thêm một chút mã của tôi, nhưng đây là điểm mà nó thực sự chậm lại. Một cái gì đó tôi chắc chắn nên đề cập đến, là nếu tôi đặt cả m1 và m2 là bằng không, tôi không thực sự có bất kỳ vấn đề gì, nhưng việc đặt m1 thành hằng số khiến mọi thứ trở nên địa ngục.

+2

nó có lẽ là giá trị chỉ ra rằng một đoạn đáng kể thời gian được dành xây dựng ma trận lên (ngay cả với memoization như Timo gợi ý).'RSolve' đưa ra một định dạng rõ ràng cho định nghĩa đệ quy của bạn là' v', mặc dù sửa chữa hàm chưa xác định (thông qua các điều kiện ban đầu) có thể phức tạp bằng cách cắt giảm chi nhánh, v.v. nhìn vào. – acl

Trả lời

9

Vấn đề của bạn là hằng số mS vẫn là biểu tượng. Điều này có nghĩa là Mathematica đang cố gắng phân tích giải tích cho các giá trị riêng thay vì số lượng. Nếu vấn đề của bạn cho phép bạn chọn một giá trị số cho mS bạn nên làm như vậy.

Các khác, không liên quan, vấn đề bạn phải là bạn đang sử dụng một công thức đệ quy và bạn muốn sử dụng, ví dụ, memoization trong dòng sau

v[n_, m_] := v[n, m] = v[n - 1, m - 1]*(m/(m - 1)) 
        + (8 m/(n + m - 1))*((1 + (-1)^(n + m))/2); 

Các phụ v[n, m] = lưu trữ các giá trị cho một trao nm, do đó bạn không phải recurse tất cả các cách để v[0,0] mỗi khi h[n, m] được gọi là trong Table[].

Với hai điều đó, việc chăm sóc bộ đôi lõi 2 cũ của tôi mất ít hơn một phút để thực hiện các giá trị riêng.

+3

Những gì tôi thực sự muốn là có thể giữ mS như một hằng số, để khi tôi nhận được một số giải pháp, tôi có thể thay đổi giá trị mS (nghĩa là tôi thực sự muốn có giải pháp về mS). Nhưng, điều đó chắc chắn có nghĩa là nó không thể tìm ra một giải pháp số vì điều đó. Tôi nghĩ rằng tôi có thể sống với xác định một giá trị số cho m1 từ đầu (tôi chỉ có thể thay đổi mà có thay vì sau này). Dù sao, cảm ơn cho trả lời, lừa đệ quy là rất tuyệt vời! – adhanlon

+0

Nếu bạn chưa làm như vậy, hãy xem những gì bạn nhận được với cutoff = 5. Sử dụng các con số cụ thể cho mS có lẽ là con đường để đi. –

3

Đây là câu trả lời tiếp theo cho câu trả lời của Timo. Tôi muốn thể hiện một con số để tôi đặt nó như một câu trả lời thay vì một bình luận.

Giả sử bạn muốn tìm giá trị riêng của ma trận có các yếu tố biểu tượng 501 x 501. [BTW bạn gọi chúng là hằng số, nhưng đó là một sự nhầm lẫn. Hằng số chỉ được xác định, giá trị cố định với tên. Những gì bạn mô tả trong bình luận của bạn tại câu trả lời của Timo là một biến tượng trưng.]

Thật tốt để xem một ma trận biểu tượng đầy đủ làm gì cho tính toán Eigenvalue. Đây là ma trận 2 x 2:

Array[f, {2, 2}] // Eigenvalues 

(* ==> 
{1/2 (f[1, 1]+f[2, 2]-Sqrt[f[1, 1]^2+4f[1, 2] f[2, 1]-2 f[1, 1] f[2, 2]+f[2, 2]^2]), 
1/2(f[1, 1]+f[2, 2]+Sqrt[f[1, 1]^2+4 f[1, 2] f[2, 1]-2 f[1, 1] f[2, 2]+f[2, 2]^2])} 
*) 

Nó chiếm Array[f, {2, 2}] // Eigenvalues//ByteCount = 3384 byte. Điều này phát triển khá nhanh: một giải pháp 7x7 đã chiếm 70 MB (phải mất vài phút để tìm cái này). Trong thực tế, có một mối quan hệ tốt đẹp để được tìm thấy giữa kích thước ma trận và số byte:

enter image description here

Chức năng được trang bị là: đếm byte = E^(2,2403067075863197 + 2,2617380321848457 x kích thước ma trận).

Như bạn có thể thấy, giá trị Eigenvalue của biểu trưng 501 x 501 sẽ không được tìm thấy trước khi kết thúc vũ trụ.

[BTW hình thức sở hữu của ma trận là gì?]

+1

Đồ thị đẹp! Một cách khác để xem xét vấn đề là nhận ra rằng việc giải quyết các giá trị riêng của ma trận nxn tương đương với việc giải quyết gốc của đa thức bậc thứ tự và thực tế là không có giải pháp chung cho * tất cả * rễ của đa thức cho n = 5 và lên. Vì vậy MMA có thể bắt đầu lắp ráp một danh sách khổng lồ các điều kiện cho các giá trị của biến 'mS' theo đó một số giá trị riêng có thể được giải quyết. – Timo

+0

@Timo Trong thực tế, MMA trả về các đối tượng 'Gốc'. Đối với ma trận trên với kích thước 6 x 6, thành viên đầu tiên của Root này đã có 32.331 phần tử. –

+0

Cảm ơn bạn đã xóa sự khác biệt giữa biến cố định và ký hiệu. Điều tôi nên nói trong bình luận của tôi là tôi muốn có câu trả lời về biến tượng trưng, ​​nhưng vì bạn đã cho thấy điều đó là không thể, tôi sẽ phải định nghĩa nó như là hằng số và thay đổi hằng số như tôi thấy Phù hợp. Cảm ơn! – adhanlon

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