Προς το περιεχόμενο

ευρεση λαθους σε matlab


plato

Προτεινόμενες αναρτήσεις

Έστω p πολυωνυμο 5ου βαθμου που εχω ορισει. Του ζηταω λοιπον σε καποιο σημειο παρακατω:

 

 

r=roots(p);

 

j=0;
    for iter=1:1:5
        if isreal(r(iter))&&r(iter)>0
             j=j+1;

            r_new(j)=r(iter);
  
        end

 


Πειτε μου που κανω λαθος αν βλεπετε καπου. Η μεταβλητη r εχει 5 στοιχεια, τις ριζες του πολυωνυμου. Πηγαινω υστερα και φτιαχνω εναν μικρο βρογχο που του λεω για καθε μια απο τις τιμες του r να ελεγχει αν ειναι πραγματικη και θετικη ταυτοχρονα και αν ισχυουν αυτοι οι δυο περιορισμοι μαζι τοτε να αποθηκευει την τιμη αυτη στην r_new και στη συνεχεια να προχωραει για τoν επομενo ελεγχο.

Που ειναι το λαθος; Διοτι ανοιγω τα r ,  r_new να δω τι τιμες εχουν μεσα και βλεπω αυτο που φαινεται στην εικονα που εχω επισυναψει. Πως γινεται αφου υπαρχει μονο μια πραγματικη τιμη στον r , να μου κραταει δυο τιμες στον r_new; Απο που προκυπτει αυτη η δευτερη στηλη με αυτον τον αριθμο στο r_new; Τι κανω λαθος;

 

Kατι κανω λαθος με την  if isreal(r(iter))&&r(iter)>0   ;;; Οταν ικανοποιηθουν οι περιορισμοι δεν αποθηκευει την τιμη στο r_new; Οταν δεν ικανοποιθουν δεν αυξανει απλα τον μετρητη j ωστε να παει απο την αρχη; Δεν θα επρεπε λοιπον να εχει κρατησει μονο την πραγματικη τιμη και καμια αλλη; Τι ειναι αυτο το νουμερο 1.9086e-04;

post-62583-0-63537800-1359350797_thumb.jpg

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Βασικά δεν φαίνεται να υπάρχει κάποιο λάθος.

Το έτρεξα για κάποια random πολυώνυμα και έβγαζε μια χαρά αποτελέσματα. Αν θες πόσταρε και το πολυώνυμο που σου έβγαλε το πρόβλημα.

Μήπως το άλλο νούμερο είναι κάποιο 'σκουπίδι' από άλλα τρεξίματα;

Βάλε ένα clear all πριν τρέχει για να είσαι σίγουρος 

 

(Στο ποστ λείπει ακόμα ένα end για το for)

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Να το ποσταρω αλλα εχει μεσα ολο σταθερες που εχω ορισει παραπανω και ειναι ολοκληρο μακρυναρι. Να τα δωσω. Να δωσω την εντολη clear all η οποια κανει τι; Δεν ειμαι παρα πολυ σχετικος με το matlab, απλα τωρα το παλευω. Το ζητημα ειναι οτι αυτο το κομματακι τρεχει μεσα σε μεγαλυτερο loop, το οποιο με τη σειρα του τρεχει καμια 700αρια φορες. Οποτε δεν ξερω αν εχω προβλημα εκει.


Οριστε ολο το προγραμματακι που κανει το εξης για να βοηθησω. Βρισκει ζευγαρια Χ,Υ τα οποια κανει plot σε γραφικη παρασταση. Τα Χ, Υ ομως εξαρτωνται απο δυο παραμετρους. Μια γωνια θ που εχει ευρος απο -π ως π κι απο το r. Το r ομως με τη σειρα του το παιρνω απο μια εξισωση 5ου βαθμου και εξαρταται επισης απο το θ. Συνεπως για καθε θ ξεκινωντας απο -π με συγκεκριμενο βημα 0.01 και ως το π κανει αριθμητικη επιλυση πρωτα του r, του ζηταω να μου κρατησει μονο μια θετικη πραγματικη ριζα και μαλιστα τη μικροτερη αν υπαρχουν παραπανω απο μια και τελικα με αυτη τη ριζα που βρηκε και το θ για το οποιο τη βρηκε να βρει το αντιστοιχο ζευγος Χ,Υ. Το ειχα ξαναποσταρει στο παρελθον με αλλου ειδους προβλημα που ειχα. Τωρα εχω σκαλωσει σε αυτο.
 

KI=1000;
KII=1000;
KIII=1000;
x=KII/KI
w=atan(x)
d=0.002;
z=0.1;
E=3400000000;
v=0.34;    
cf=10^(-10);
cr=-1.7*(10^(-10));
lm=1
G= E/(2*(1+v));
A1= (3*z*cf*d*KI)/(2*((2*pi)^0.5));
A2= (3*z*cf*d*KII)/(2*((2*pi)^0.5));
A3= (z*KIII)/(G*((2*pi)^0.5));
C1= (cf*d*KI)/((2*pi)^0.5);
C2= (cf*d*KII)/((2*pi)^0.5);
C3= (2*KIII)/(G*((2*pi)^0.5));
A= ((A1^2)+ (A2^2))^0.5;
C= ((C1^2)+ (C2^2))^0.5;



tmp=0;
for th=-pi:0.01:pi
    tmp=tmp+1;
    p=[lm^2 0 0 -(A3.^2) 0 (2.*A.*A3.*sin(th+w)-(A.^2))];
    r = roots(p);

    j=0;
    for iter=1:1:5
        if isreal(r(iter))&& r(iter)>0
            j=j+1;
            r_new(j)=r(iter); %dhmiourgw mia nea metablhth pou apothkeuei mono pragmatikous thetikous
        end
    
    end

    r_final=min(r_new); %krataw thn mikroterh timh apo tis thetikes pragmatikes rizes

  X(tmp)=lm* r_final*cos(th) - C*z*(r_final^(-1.5))*cos((1.5*th)+ w) + z*(r_final^(-0.5))*C3*sin(th/2);

 
  Y(tmp)=lm* r_final*sin(th) - C*z*(r_final^(-1.5))*sin((1.5*th)+ w) - z*(r_final^(-0.5))*C3*cos(th/2);

end

plot (X,Y)


Μου εχει σπασει τα νευρα απο που διαολο κραταει αυτην τιμη. Που τη βρισκει και την παιρνει; Γιατι βλεπεις τι ζημια μου κανει; Εκει που του ζηταω να κρατησει τη μικροτερη τελικα κραταει αυτην η οποια δεν ξερω απο που προκυπτει! Κι οταν αυτο το κανει εκατονταδες φορες ειναι αδυνατον αν δω τι συμβαινει μεσα στις μεταβλητες. Μπορω να χρησιμοποιησω την εντολη που λες για "καθαρισμο" των μεταβλητων r, r_new κτλ. χωρις να επηρεαστουν οι αλλες μεταβλητες μου; Πώς ακριβως χρησιμοποιειται; Μπορεις να μου δειξεις πανω στο προγραμμα;

 

Χιλια ευχαριστω φιλε για την βοηθεια σου!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Θα κάτσω σε λίγο να δω το σκριπτάκι στου, αλλά όσον αφορά την clear καθαρίζει μεταβλητές από το workspace

 

Οπότε clear all τα σβήνει όλα, ενώ

clear r r_new variable_x σβήνει μόνο τις συγκεκριμένες μεταβλητές.

 

Γενικά αν δεν ξες μια συνάρτηση να συμβουλεύεσαι το documentatio & help της Matlab είναι πολύ καλό.



tmp=0;
for th=-pi:0.01:pi
    tmp=tmp+1;
    p=[lm^2 0 0 -(A3.^2) 0 (2.*A.*A3.*sin(th+w)-(A.^2))];
    r = roots(p);

    j=0;
    for iter=1:1:5
        if isreal(r(iter))&& r(iter)>0
            j=j+1;
            r_new(j)=r(iter); %dhmiourgw mia nea metablhth pou apothkeuei mono pragmatikous thetikous
        end
    
    end

    r_final=min(r_new); %krataw thn mikroterh timh apo tis thetikes pragmatikes rizes

  X(tmp)=lm* r_final*cos(th) - C*z*(r_final^(-1.5))*cos((1.5*th)+ w) + z*(r_final^(-0.5))*C3*sin(th/2);

 
  Y(tmp)=lm* r_final*sin(th) - C*z*(r_final^(-1.5))*sin((1.5*th)+ w) - z*(r_final^(-0.5))*C3*cos(th/2);

end

plot (X,Y)

Λοιπόν το κομμάτι δήλωσης μεταβλητών δεν το κοίταξα ιδιαίτερα, φαντάζομαι τα έχεις κάνει έτσι για να μπορείς να αλλάζει εύκολα κάποιες παραμέτρους.

 

Όσον αφορά τις λούπες τώρα.Σε κάθε βήμα σαρώματος του π δημιουργείς το πολυώνυμο, το λύνεις και κάνεις ό,τι είναι να κάνεις.

Κατ'αρχήν το κομμάτι

r_final=min(r_new); %krataw thn mikroterh timh apo tis thetikes pragmatikes rizes

  X(tmp)=lm* r_final*cos(th) - C*z*(r_final^(-1.5))*cos((1.5*th)+ w) + z*(r_final^(-0.5))*C3*sin(th/2);

 
  Y(tmp)=lm* r_final*sin(th) - C*z*(r_final^(-1.5))*sin((1.5*th)+ w) - z*(r_final^(-0.5))*C3*cos(th/2);

 

εκτελείται κάθε φορά, άσχετα με το αν το πολυώνυμο έχει θετικές πραγματικές ρίζες. Δεν ξέρω βέβαια αν το θες αυτό.

 

Τώρα στο πρόβλημα. Έστω ότι κάποιο p έχει 2 θετικές πραγματικές ρίζες. Το r_new θα είναι 1x2 πίνακας. Μετά από κάποιες επαναλήψεις βρίσκεται ξανά p που έχει 1 θετική πραγματική ρίζα. Τότε θα αλλάξει μόνο το πρώτο κελί του r_new, το οποίο θα συνεχίζει να είναι 1X2, άρα θα κουβαλάει το σκουπίδι από προηγούμενες λύσεις.

 

Οπότε ή θα πρέπει να βάλεις κι άλλες συνθήκες ή πριν τις λούπες να αρχικοποιείς κάθε φορά τις μεταβλητές ή να τις καθαρίζεις.

Ψαξ'το λίγο θα βγάλεις άκρη.

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...