Bạn đang tìm quá ít giá trị xác định vì Matlab đang sử dụng hàm xác định khác (hoặc một số lý do khác giống như độ chính xác của dấu phẩy động liên quan đến hai phương pháp khác nhau). Tôi sẽ cho bạn thấy rằng Matlab về cơ bản là cung cấp cho bạn các giá trị chính xác và một cách tốt hơn để tiếp cận vấn đề này nói chung.
Trước tiên, hãy lấy mã của bạn và thay đổi nó một chút.
format compact; format short g; clear; clc;
L = 140; J = 77; Jm = 10540; G = 0.8*10^8; d = L/3;
vals = zeros(1,500000);
for i=1:500000
omegan=1.+0.0001*i;
a(1,1) = ((omegan^2)*(Jm/(G*J))*d^2)-2; a(1,2) = 2; a(1,3) = 0; a(1,4) = 0;
a(2,1) = 1; a(2,2) = ((omegan^2)*(Jm/(G*J))*d^2)-2; a(2,3) = 1; a(2,4) = 0;
a(3,1) = 0; a(3,2) = 1; a(3,3) = ((omegan^2)*(Jm/(G*J))*d^2)-2; a(3,4) = 1;
a(4,1) = 0; a(4,2) = 0; a(4,3) = 2; a(4,4) = ((omegan^2)*(Jm/(G*J))*d^2)-2;
vals(i) = abs(det(a));
if(vals(i)<1E-10)
sprintf('omegan= %8.3f det= %8.3f',omegan,det(a))
end
end
plot(1.+0.0001*(1:500000),log(vals))
Tất cả những gì tôi đã thực hiện thực sự được đăng nhập các giá trị của các yếu tố quyết định cho tất cả các giá trị của omegan và vẽ các bản ghi của những giá trị yếu tố quyết định là một hàm của omegan. Dưới đây là cốt truyện:
![alt text](https://imgur.com/2wu5o.jpg)
Bạn nhận thấy ba dips lớn trong đồ thị. Hai trùng với kết quả của bạn là 16.3818 và 32.7636, nhưng cũng có thêm một kết quả mà bạn bị thiếu (có thể do điều kiện của yếu tố quyết định nhỏ hơn 1e-10 quá thấp ngay cả khi mã Fortran của bạn nhận được nó). Do đó, Matlab cũng nói với bạn rằng đó là những giá trị của omegan mà bạn đang tìm kiếm, nhưng vì yếu tố quyết định được xác định theo một cách khác nhau trong Matlab, các giá trị không giống nhau - không đáng ngạc nhiên khi xử lý ma trận kém . Ngoài ra, nó có thể đã làm với Fortran bằng cách sử dụng phao chính xác đơn như người khác nói. Tôi sẽ không xem xét lý do tại sao họ không phải vì tôi không muốn lãng phí thời gian của tôi vào đó. Thay vào đó, hãy nhìn vào những gì bạn đang cố gắng làm và thử một cách tiếp cận khác.
Bạn, như tôi chắc chắn rằng bạn đã biết, đang cố gắng để tìm ra giá trị riêng của ma trận
a = [[-2 2 0 0]; [1 -2 1 0]; [0 1 -2 1]; [0 0 2 -2]];
, cài đặt chúng bằng
-omegan^2*(Jm/(G*J)*d^2)
và giải quyết cho omegan. Đây là cách tôi đã đi về nó:
format compact; format short g; clear; clc;
L = 140; J = 77; Jm = 10540; G = 0.8*10^8; d = L/3;
C1 = (Jm/(G*J)*d^2);
a = [[-2 2 0 0]; [1 -2 1 0]; [0 1 -2 1]; [0,0,2,-2]];
myeigs = eig(a);
myeigs(abs(myeigs) < eps) = 0.0;
for i=1:4
sprintf('omegan= %8.3f', sqrt(-myeigs(i)/C1))
end
này cung cấp cho bạn tất cả bốn giải pháp - không chỉ hai mà bạn đã tìm thấy với mã Fortran của bạn (mặc dù một trong số họ, không, là ngoài phạm vi thử nghiệm của bạn cho omegan). Nếu bạn muốn giải quyết điều này bằng cách kiểm tra yếu tố quyết định trong Matlab, như bạn đã cố gắng thực hiện, thì bạn sẽ phải chơi với giá trị mà bạn đang kiểm tra giá trị tuyệt đối của yếu tố quyết định nhỏ hơn. Tôi đã nhận nó để làm việc cho một giá trị của 1e-4 (nó đã cho 3 giải pháp: 16.382, 28.374, và 32.764).
Xin lỗi vì giải pháp dài như vậy, nhưng hy vọng nó sẽ giúp ích.
Cập nhật:
Trong khối đầu tiên của tôi về mã trên, tôi đã thay thế
vals(i) = abs(det(a));
với
[L,U] = lu(a);
s = det(L);
vals(i) = abs(s*prod(diag(U)));
đó là thuật toán mà det được cho là sử dụng theo quy định của Matlab tài liệu. Bây giờ, tôi có thể sử dụng 1E-10 làm điều kiện và nó hoạt động. Vì vậy, có lẽ Matlab không tính toán định thức chính xác như các tài liệu nói? Đây là loại đáng lo ngại.
Hấp dẫn. Đối với tôi, nó cũng không bao giờ dừng lại. Các giá trị tôi nhận được cho det (a) là -4E-5, và -3E-4 với omegan của bạn (nếu tôi không mắc lỗi). Chỉ để kiểm tra lỗi: Bạn có nhận được một danh sách các giá trị cho det (a) từ chương trình fortran và so sánh chúng với các giá trị từ Matlab không? – Jonas
@ Jonas - Không, tôi nghĩ đó là dư thừa. Sau khi tất cả, tôi chỉ cần sao chép (sửa đổi cần thiết) chương trình fortran để MATLAB, và kể từ khi MATLAB làm việc trong chế độ dp theo mặc định, tôi tin rằng nó sẽ giải quyết nó mà không có vấn đề. Như tôi đã nói trong bình luận cho gnovice, đây chỉ là ví dụ - Tôi không phải tất cả những gì quan tâm đến kết quả, nhiều như sự khác biệt giữa fortran và MATLAB (Tôi vẫn đang thử nghiệm nếu MATLAB có thể xử lý loại vấn đề này). – Rook
@Idigas: Tôi hiểu rằng bạn không đặc biệt quan tâm đến vấn đề cụ thể này. Nhưng nếu nó thực sự là một vấn đề chính xác, bạn sẽ không muốn biết trong điều kiện nào nó xảy ra? Ngoài ra, như những người khác đã lưu ý: Matlab không tìm thấy các giải pháp, nó chỉ là cutoff có thể khác nhau. – Jonas