आप बहुत कम निर्धारक मानों की तलाश में हैं क्योंकि मैटलैब एक अलग निर्धारक फ़ंक्शन का उपयोग कर रहा है (या दो अन्य तरीकों से जुड़े फ्लोटिंग पॉइंट सटीकता के साथ कुछ अन्य कारण)। मैं आपको दिखाऊंगा कि मैटलैब अनिवार्य रूप से आपको सही मूल्य और सामान्य रूप से इस समस्या से संपर्क करने का एक बेहतर तरीका दे रहा है।
सबसे पहले, चलिए अपना कोड लें और इसे थोड़ा बदल दें।
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))
सभी कि मैं वास्तव में किया है omegan के सभी मानों के लिए निर्धारक के मूल्यों लॉग इन और omegan के एक समारोह के रूप में उन निर्धारक मूल्यों का लॉग साजिश रची है।
आप ग्राफ में तीन प्रमुख डुबकी नोटिस: यहाँ साजिश है। दो 16.3818 और 32.7636 के परिणामों के साथ मेल खाते हैं, लेकिन एक अतिरिक्त भी है जिसे आप याद कर रहे थे (संभवतः क्योंकि आपके फोरट्रान कोड को लेने के लिए निर्धारक की आपकी स्थिति 1e-10 से भी कम थी)। इसलिए, मैटलैब आपको यह भी बता रहा है कि वे ओमेगन के मूल्य हैं जिन्हें आप ढूंढ रहे थे, लेकिन निर्धारक की वजह से मैटलैब में एक अलग तरीके से निर्धारित किया गया था, मूल्य समान नहीं थे - बुरी तरह से वातानुकूलित मैट्रिक्स से निपटने पर आश्चर्य की बात नहीं । इसके अलावा, इसे शायद फोरट्रान के साथ एकल परिशुद्धता फ्लोट का उपयोग करना होगा जैसा कि किसी और ने कहा था। मैं नहीं देख रहा हूं कि वे क्यों नहीं हैं क्योंकि मैं उस पर अपना समय बर्बाद नहीं करना चाहता हूं। इसके बजाए, देखते हैं कि आप क्या करने की कोशिश कर रहे हैं और एक अलग दृष्टिकोण का प्रयास करें।
आप, के रूप में मुझे यकीन है कि आप जानते हैं, मैट्रिक्स
a = [[-2 2 0 0]; [1 -2 1 0]; [0 1 -2 1]; [0 0 2 -2]];
eigenvalues के मिल जाए, सेट उन्हें बराबर
-omegan^2*(Jm/(G*J)*d^2)
और omegan के लिए हल करने के लिए कोशिश कर रहे हैं रहा हूँ। इस तरह मैं इसके बारे में चला गया है:
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
यह आप सभी चार समाधान देता है - न सिर्फ दो है कि आप अपने फोरट्रान कोड के साथ मिल गया था (हालांकि उनमें से एक, शून्य, omegan के लिए अपने परीक्षण सीमा के बाहर था)। यदि आप Matlab में निर्धारक की जांच करके इसे हल करने के बारे में जाना चाहते हैं, जैसा कि आप करने का प्रयास कर रहे हैं, तो आपको उस मान के साथ खेलना होगा जिसे आप निर्धारक के पूर्ण मूल्य से कम होने की जांच कर रहे हैं। मुझे इसे 1e-4 के मान के लिए काम करने के लिए मिला (यह 3 समाधान दिए: 16.382, 28.374, और 32.764)।
इतने लंबे समाधान के लिए खेद है, लेकिन उम्मीद है कि यह मदद करता है।
अद्यतन:
ऊपर कोड की मेरी पहली ब्लॉक में, मैं
vals(i) = abs(det(a));
प्रतिस्थापित
[L,U] = lu(a);
s = det(L);
vals(i) = abs(s*prod(diag(U)));
साथ जो एल्गोरिथ्म कि det माना जाता है कि Matlab के अनुसार उपयोग कर रहा है डॉक्स। अब, मैं शर्त के रूप में 1E-10 का उपयोग करने में सक्षम हूं और यह काम करता है। तो शायद मैटलैब निर्धारक की गणना नहीं कर रहा है जैसे दस्तावेज़ कहते हैं? यह परेशान है।
द्वारा प्राप्त कारकों से गणना की जाती है से आते हैं दिलचस्प। मेरे लिए, यह कभी भी बंद नहीं होता है। मुझे (ओ) के लिए प्राप्त मूल्य -4 ई -5, और -3 ई -4 आपके ओमेगन के साथ हैं (यदि मैंने कोई गलती नहीं की है)। सिर्फ त्रुटियों की जांच करने के लिए: क्या आपको फोर्टन प्रोग्राम से det (ए) के लिए मूल्यों की एक सूची मिली और उन्हें Matlab से तुलना करें? – Jonas
@ जोनास - नहीं, मैंने सोचा कि अनावश्यक था। आखिरकार, मैंने सिर्फ फोर्ट्रान प्रोग्राम को मैटलैब में कॉपी किया (आवश्यक संशोधन कर रहा है), और चूंकि मैटलैब डिफ़ॉल्ट रूप से डीपी मोड में काम करता है, मुझे विश्वास था कि यह बिना किसी समस्या के इसे हल करेगा। जैसा कि मैंने gnovice पर टिप्पणी में कहा था, यह केवल उदाहरण था - मैं परिणामों में जितना दिलचस्पी नहीं रखता हूं, उतना ही जितना कि फोर्टन और मैटलैब के बीच विसंगतियां (मैं अभी भी परीक्षण कर रहा हूं अगर मैटलैब इस तरह की समस्याओं को संभाल सकता है)। – Rook
@Idigas: मैं समझता हूं कि आप विशेष रूप से इस विशिष्ट समस्या में रूचि नहीं रखते हैं। लेकिन अगर यह वास्तव में एक सटीक मुद्दा है, तो क्या आप यह जानना नहीं चाहते कि यह किस स्थितियों में होता है? साथ ही, जैसा कि अन्य ने ध्यान दिया है: मैटलैब को समाधान मिलते हैं, यह सिर्फ कटऑफ है जो अलग हो सकता है। – Jonas