2010-05-07 21 views
6

मैं निम्नलिखित कार्यक्रमmatlab परिशुद्धता निर्धारक समस्या

format compact; format short g; clear; clc; 
L = 140; J = 77; Jm = 10540; G = 0.8*10^8; d = L/3; 
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; 

if(abs(det(a))<1E-10) sprintf('omegan= %8.3f det= %8.3f',omegan,det(a)) 
end   
end 

ऊपर प्रणाली का विश्लेषणात्मक समाधान, और एक ही program written in fortran 16.3818 और 32.7636 (fortran मूल्यों के omegan बराबर के मूल्यों बाहर देता है, विश्लेषणात्मक, एक छोटे से अलग है, लेकिन वे कहीं कहीं हैं)।

तो, अब मैं सोच रहा हूं ... मैं इसके साथ गलत कहां जा रहा हूं? Matlab अपेक्षित परिणाम क्यों नहीं दे रहा है?

(यह शायद बहुत सरल कुछ है, लेकिन यह मेरे सिर दर्द दे रही है)

+0

द्वारा प्राप्त कारकों से गणना की जाती है से आते हैं दिलचस्प। मेरे लिए, यह कभी भी बंद नहीं होता है। मुझे (ओ) के लिए प्राप्त मूल्य -4 ई -5, और -3 ई -4 आपके ओमेगन के साथ हैं (यदि मैंने कोई गलती नहीं की है)। सिर्फ त्रुटियों की जांच करने के लिए: क्या आपको फोर्टन प्रोग्राम से det (ए) के लिए मूल्यों की एक सूची मिली और उन्हें Matlab से तुलना करें? – Jonas

+0

@ जोनास - नहीं, मैंने सोचा कि अनावश्यक था। आखिरकार, मैंने सिर्फ फोर्ट्रान प्रोग्राम को मैटलैब में कॉपी किया (आवश्यक संशोधन कर रहा है), और चूंकि मैटलैब डिफ़ॉल्ट रूप से डीपी मोड में काम करता है, मुझे विश्वास था कि यह बिना किसी समस्या के इसे हल करेगा। जैसा कि मैंने gnovice पर टिप्पणी में कहा था, यह केवल उदाहरण था - मैं परिणामों में जितना दिलचस्पी नहीं रखता हूं, उतना ही जितना कि फोर्टन और मैटलैब के बीच विसंगतियां (मैं अभी भी परीक्षण कर रहा हूं अगर मैटलैब इस तरह की समस्याओं को संभाल सकता है)। – Rook

+0

@Idigas: मैं समझता हूं कि आप विशेष रूप से इस विशिष्ट समस्या में रूचि नहीं रखते हैं। लेकिन अगर यह वास्तव में एक सटीक मुद्दा है, तो क्या आप यह जानना नहीं चाहते कि यह किस स्थितियों में होता है? साथ ही, जैसा कि अन्य ने ध्यान दिया है: मैटलैब को समाधान मिलते हैं, यह सिर्फ कटऑफ है जो अलग हो सकता है। – Jonas

उत्तर

2

न्यू जवाब:

आप प्रतीकात्मक समीकरण का प्रयोग कर इस समस्या की जांच कर सकते हैं, जो मुझे सही जवाब देता है:

>> clear all    %# Clear all existing variables 
>> format long   %# Display more digits of precision 
>> syms Jm d omegan G J %# Your symbolic variables 
>> a = ((Jm*(d*omegan)^2)/(G*J)-2).*eye(4)+... %# Create the matrix a 
     diag([2 1 1],1)+... 
     diag([1 1 2],-1); 
>> solns = solve(det(a),'omegan') %# Solve for where the determinant is 0 

solns = 

           0 
           0 
      (G*J*Jm)^(1/2)/(Jm*d) 
      -(G*J*Jm)^(1/2)/(Jm*d) 
     -(2*(G*J*Jm)^(1/2))/(Jm*d) 
     (2*(G*J*Jm)^(1/2))/(Jm*d) 
    (3^(1/2)*(G*J*Jm)^(1/2))/(Jm*d) 
-(3^(1/2)*(G*J*Jm)^(1/2))/(Jm*d) 

>> solns = subs(solns,{G,J,Jm,d},{8e7,77,10540,140/3}) %# Substitute values 

solns = 

        0 
        0 
    16.381862247021893 
-16.381862247021893 
-32.763724494043785 
    32.763724494043785 
    28.374217734436371 
-28.374217734436371 

मुझे लगता है कि आप या तो omegan ओ के समाधान के लिए पर्याप्त रूप से अपने लूप में मूल्यों का चयन नहीं कर रहे थे निर्धारक को शून्य के करीब कितना करीब है, यह बहुत सख्त है। जब मैं a को दिया मूल्यों में प्लग, omegan = 16.3819 के साथ (जो एक ही समाधान अपने पाश का उत्पादन के लिए निकटतम मान है), मैं इस मिल:

>> det(subs(a,{omegan,G,J,Jm,d},{16.3819,8e7,77,10540,140/3})) 

ans = 

    2.765476845475786e-005 

कौन सा अभी भी 1e-10 से पूर्ण आयाम में बड़ा है।

+0

हैलो gnovice, मैं उम्मीद कर रहा था आप द्वारा रुकेंगे :) नहीं, "कम तब" संकेत ठीक है (जब तक कि मुझे कुछ ऐसा याद आ रहा है जिसे आप इंगित करने की कोशिश कर रहे हैं)। यह कंपन में एक ईजिनॉल समस्या है ... मुझे सभी ओमेगन्स (प्राकृतिक आवृत्तियों) जिसके लिए निर्धारक शून्य है। उनमें से एक अनंत संख्या है, लेकिन मैं केवल पहले कुछ (दो या तीन) की तलाश में हूं। हालांकि, मुझे समझ में नहीं आ रहा है कि क्यों मेरा किलान कार्यक्रम बिना "निगलता है" समस्या, और det() फ़ंक्शन नहीं करता है। यह डी ऐसा लगता है कि एक सिंगल/डबल – Rook

+0

सटीक समस्या या तो नहीं - फोर्टन प्रोग्राम इसे एकल में करता है, और डिफ़ॉल्ट रूप से मैटलैब में सब कुछ डबल परिशुद्धता में होता है। तो matlab शुरू से फायदा होना चाहिए। – Rook

+0

स्प्रिंटफ वास्तव में अनिवार्य है, यह केवल यहां है इसलिए लोग जो इसे समझने की कोशिश करेंगे उन्हें खुद को जोड़ना नहीं होगा। जैसा कि मैंने कहा, मैं इस मामले में पहले ही परिणाम जानता हूं। मुझे इस त्रुटि के कारण में अधिक दिलचस्पी है, क्योंकि अब मुझे नहीं पता कि अगर मैं बड़ी समस्या को हल करते समय मैटलैब के तंत्र पर भरोसा कर सकता हूं (जिसके लिए मुझे परिणाम नहीं पता)। – Rook

3

आप बहुत कम निर्धारक मानों की तलाश में हैं क्योंकि मैटलैब एक अलग निर्धारक फ़ंक्शन का उपयोग कर रहा है (या दो अन्य तरीकों से जुड़े फ्लोटिंग पॉइंट सटीकता के साथ कुछ अन्य कारण)। मैं आपको दिखाऊंगा कि मैटलैब अनिवार्य रूप से आपको सही मूल्य और सामान्य रूप से इस समस्या से संपर्क करने का एक बेहतर तरीका दे रहा है।

सबसे पहले, चलिए अपना कोड लें और इसे थोड़ा बदल दें।

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 के एक समारोह के रूप में उन निर्धारक मूल्यों का लॉग साजिश रची है।

alt text

आप ग्राफ में तीन प्रमुख डुबकी नोटिस: यहाँ साजिश है। दो 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 का उपयोग करने में सक्षम हूं और यह काम करता है। तो शायद मैटलैब निर्धारक की गणना नहीं कर रहा है जैसे दस्तावेज़ कहते हैं? यह परेशान है।

+0

यह समस्या हो सकती है (विभिन्न निर्धारक फ़ंक्शन का उपयोग करके मैटलैब)। क्या आप जानते हैं कि कोई यह पता लगा सकता है कि इसके लिए एल्गोरिदम matlab क्या उपयोग कर रहा है? बीटीडब्ल्यू, मैं इस प्रणाली को हल करने के प्रयास में सराहना करता हूं, लेकिन दुर्भाग्य से मैं इसे अपने काम में उपयोग करने में सक्षम नहीं हूं। गुणांक मैट्रिस जो मैं उपयोग करता हूं, पहले से लिखित कार्यों का उपयोग करके इकट्ठा किया जाता है, और हमेशा अधिक जटिल (और बड़ा) होता है, तो यह एक (जो एक साधारण बीम के लिए 3 तत्व/4 नोड्स में विभाजित होता है)। – Rook

+0

मुझे तीसरे (या दूसरा, यह निर्भर करता है कि आप इसे कैसे देखते हैं) ओमेगन को याद नहीं किया। फोरट्रान कार्यक्रम ने उसे भी दिया। यह सिर्फ यही है, यह समाधानों में से एक नहीं था, हालांकि यह संख्यात्मक रूप से सही था। Freqs।कुछ राशन में एक दूसरे में होना चाहिए। मैं क्षमा चाहता हूं अगर मैंने आपको इसके साथ कुछ भ्रम पैदा किया; मुझे पर सवाल उठाना चाहिए था। – Rook

+0

मुझे यह बहुत परेशान बीटीडब्ल्यू लगता है। मुझे उम्मीद थी कि अगर मैटलैब डबल परिशुद्धता में काम करता है, और यदि मैं अपने फोर्ट्रान प्रोग्राम ऐसे में लिखता हूं; मैं बिना किसी पुनर्लेखन के अधिक परिणाम प्राप्त कर पाऊंगा (ज्यादातर ** ऑपरेटर^:)। मैंने मैटलैब के कार्यों को समस्याओं का कारण बनने की उम्मीद नहीं की थी। – Rook

1

मैंने इसे एक उत्तर के रूप में रखा क्योंकि मैं इसे एक टिप्पणी में पेस्ट नहीं कर सकता: यहां बताया गया है कि मैटलैब determinant की गणना कैसे करता है। मुझे लगता है गोलाई त्रुटियों यू

में कई विकर्ण तत्वों के उत्पाद की गणना एल्गोरिथ्म

निर्धारक त्रिकोणीय गाऊसी उन्मूलन

[L,U] = lu(A) s = det(L)   
%# This is always +1 or -1 
det(A) = s*prod(diag(U)) 
संबंधित मुद्दे