PDA

Επιστροφή στο Forum : HELP !! PID Controller με Mathematica προγραμμ.



tripodous
12-04-12, 15:36
Γεια σας παιδιά,εχω πτυχιακη εργασια μια εφαρμογη μιας υδραυλικης αναρτησης με ελεγχο PID και το κανω στο mathematica οποιος ξερει απο Mathematica και μπορει να βοηθησει λιγο ας κανει ενα κοπο ,εχω κολλησει καπου με τον κωδικα !ΤΕΙ Αυτοματισμου!οποιος θελει να βοηθησει ασ στειλεει ΠΜ.Ευχαριστώ

somone
18-04-12, 11:34
Για πες αναλυτικά μήπως και βρεθεί άκρη...

tripodous
18-04-12, 16:45
Για πες αναλυτικά μήπως και βρεθεί άκρη...

εχω τον χωρο καταστασης ετοιμο, Α,Β,C και κανω το Pclose(κλειστο συστημα το χαρακ.πολυωνυμο) με τον PID:
Pcl = Collect[Simplify[s*Det[s*IdentityMatrix[6] - A + B.c*PID]], s], και βγαζει το πολυωνυμο 7ης ταξης με τα Ki,Kp,Kd κερδη μεσα,
μετα κανω routh πινακα!
Routh = ( {
{S7, S5, S3, S1},
{S6, S4, S2, S0},
{b1, b2, b3, 0},
{c1, c2, c3, 0},
{d1, d2, 0, 0},
{e1, e2, 0, 0},
{f1, 0, 0, 0},
{S0, 0, 0, 0}
} )

και φτιαχνω τις οριζουσες για b1,c1,d1,e1,f1 kai τα θελω >0. και το κανω με reduce kai findinstance εντολες. τωρα οποιος δεν βαριεται να ριξει μια ματια στον κωδικα να του εξηγησω περεταιρω!ευχαριστω

somone
18-04-12, 19:09
Αν είναι κάτι προγραμματιστικό ίσως μπορώ να σε βοηθήσω, ανέβασε κώδικα αν είναι...

tripodous
18-04-12, 22:34
Αν είναι κάτι προγραμματιστικό ίσως μπορώ να σε βοηθήσω, ανέβασε κώδικα αν είναι...

31953
to pid kodikas

somone
19-04-12, 13:22
Λοιπόν το κοίταξα λίγο, τώρα δεν ξέρω αν φτέει το pdf (καλύτερα να ανέβαζες το .nb) αλλά βρήκα ένα λάθος σε αυτές τις εκφράσεις:

f1=-(Det[Routh[[{5,6},{1,2}]]]/e1)

όπου το Routh[[{5,6},{1,2}]] το έχει στο pdf με ένα bracket δηλαδή έτσι Routh[{5,6},{1,2}].

Επίσης, αυτό S0=(Pcl)[[1]] μήπως είναι S0=(Pcl)[[1,2]];;

Και τέλος αυτό S0=S0=(Out[23])[[1]] δεν το κατάλαβα, και σίγουρα δεν είναι καλή ιδέα να φτίαχνεις το πρόγραμμα σου έτσι ώστε να εξαρτάτε από τον αριθμό που έχουν οι προηγούμενοι έξοδοι.
Κατά τα άλλα το πρόγραμμα φαίνεται να λειτουργεί (δεν έιχα χρόνο να το αφήσω να ολοκληρωθεί για να δω αν κολάει κάπου ). Αν είναι κάτι άλλο καλύτερα ανέβασε το nb και πες ακριβώς τι πρόβλημα αντιμετωπίζεις...

tripodous
19-04-12, 20:38
Λοιπόν το κοίταξα λίγο, τώρα δεν ξέρω αν φτέει το pdf (καλύτερα να ανέβαζες το .nb) αλλά βρήκα ένα λάθος σε αυτές τις εκφράσεις:

f1=-(Det[Routh[[{5,6},{1,2}]]]/e1)

όπου το Routh[[{5,6},{1,2}]] το έχει στο pdf με ένα bracket δηλαδή έτσι Routh[{5,6},{1,2}].

Επίσης, αυτό S0=(Pcl)[[1]] μήπως είναι S0=(Pcl)[[1,2]];;

Και τέλος αυτό S0=S0=(Out[23])[[1]] δεν το κατάλαβα, και σίγουρα δεν είναι καλή ιδέα να φτίαχνεις το πρόγραμμα σου έτσι ώστε να εξαρτάτε από τον αριθμό που έχουν οι προηγούμενοι έξοδοι.
Κατά τα άλλα το πρόγραμμα φαίνεται να λειτουργεί (δεν έιχα χρόνο να το αφήσω να ολοκληρωθεί για να δω αν κολάει κάπου ). Αν είναι κάτι άλλο καλύτερα ανέβασε το nb και πες ακριβώς τι πρόβλημα αντιμετωπίζεις...


Λοιπον Πρωτα απολα να σε ευχαριστισω για τον κοπο σου.Οσο για το S0=S0=(Out[23])[[1]] το αλλαξα και εβαλα αυτο π φαινεται στο κωδικα!το f1 καλα ηταν δεν ειχε λαθος και το S0=(Pcl)[[1]] ειναι οπως ειναι γιατι βγαζει τον συντελεστη του S^0 τον σταθερο ορο δλδ με το Κi.Στελνω τον κωδικα σε word gt δεν αναγνωριζει το .nb αρχειο.ΚΑι το κυριο προβλημα μ ειναι οτι οταν τρεχω τους αγνωστους στο πινακα ROuth τρεχει μεχρι το e2 με μια μικρη καθυεστερηση οπως φαινεται και κολλαει στο να μ βγαλει το f1 και την τελευταια γραμμη κωδικα που 8α μου εβγαζε τυχαια Ki.Kp.Kd που να ευσταθιοποιουν το συστημα!δεν μπορω να ανεβασω αλο αρχειο εκτοσ απο pdf.
In[1]:= A = ( {
{0, -1, 0, 0, 0, 0},
{Kt/mu, -(Ct + Cs)/mu, -Ks/mu, Cs/mu, -Ap/mu, 0},
{0, 1, 0, -1, 0, 0},
{0, Cs/ms, Ks/ms, -Cs/ms, Ap/ms, 0},
{0, Ap*a, 0, -Ap*a, -a*Ctm, a*Cd*Sqrt[Ps/p]*w},
{0, 0, 0, 0, 0, -1/T}
} )
B = ( {
{0},
{0},
{0},
{0},
{0},
{k/T}
} )
c = ( {
{0, 0, 0, 0, 0, 1}
} )

Out[1]= {{0, -1, 0, 0, 0, 0}, {Kt/mu, (-Cs - Ct)/mu, -(Ks/mu), Cs/
mu, -(Ap/mu), 0}, {0, 1, 0, -1, 0, 0}, {0, Cs/ms, Ks/ms, -(Cs/ms),
Ap/ms, 0}, {0, a Ap, 0, -a Ap, -a Ctm, a Cd Sqrt[Ps/p] w}, {0, 0, 0,
0, 0, -(1/T)}}

Out[2]= {{0}, {0}, {0}, {0}, {0}, {k/T}}

Out[3]= {{0, 0, 0, 0, 0, 1}}

In[4]:= Ap = 0.0044
Cd = 0.7
Ctm = 15*10^-12
Cs = 12000
Ct = 200
k = 1481
Ks = 240
Kt = 1000
kv = 2.1
ms = 2800
mu = 270
Ps = 20684
w = 0.008
p = 3500
a = 2.273*10^9
T = 1/15
v = 1

Out[4]= 0.0044

Out[5]= 0.7

Out[6]= 3/200000000000

Out[7]= 12000

Out[8]= 200

Out[9]= 1481

Out[10]= 240

Out[11]= 1000

Out[12]= 2.1

Out[13]= 2800

Out[14]= 270

Out[15]= 20684

Out[16]= 0.008

Out[17]= 3500

Out[18]= 2.273*10^9

Out[19]= 1/15

Out[20]= 1

In[21]:= PID = Kp + Ki/s + Kd*s


Out[21]= Kp + Ki/s + Kd s

In[22]:= Pcl =
Collect[Simplify[s*Det[s*IdentityMatrix[6] - A + B.c*PID]], s]

Out[22]= 240.451 Ki +
1. (0.162357 + 1.31221*10^6 Ki + 240.451 Kp) s +
1. (886.044 + 240.451 Kd + 618596. Ki + 1.31221*10^6 Kp) s^2 +
1. (476.757 + 1.31221*10^6 Kd + 4.18171*10^6 Ki + 618596. Kp) s^3 +
1. (2851.42 + 618596. Kd + 1.09975*10^6 Ki + 4.18171*10^6 Kp) s^4 +
1. (930.813 + 4.18171*10^6 Kd + 22215 Ki + 1.09975*10^6 Kp) s^5 +
1. (64.505 + 1.09975*10^6 Kd + 22215 Kp) s^6 + 1. (1 + 22215 Kd) s^7

In[23]:=
S7 = (Pcl)[[8, 2]]
S6 = (Pcl)[[7, 2]]
S5 = (Pcl)[[6, 2]]
S4 = (Pcl)[[5, 2]]
S3 = (Pcl)[[4, 2]]
S2 = (Pcl)[[3, 2]]
S1 = (Pcl)[[2, 2]]
S0 = (Pcl)[[1]]

Out[23]= 1 + 22215 Kd

Out[24]= 64.505 + 1.09975*10^6 Kd + 22215 Kp

Out[25]= 930.813 + 4.18171*10^6 Kd + 22215 Ki + 1.09975*10^6 Kp

Out[26]= 2851.42 + 618596. Kd + 1.09975*10^6 Ki + 4.18171*10^6 Kp

Out[27]= 476.757 + 1.31221*10^6 Kd + 4.18171*10^6 Ki + 618596. Kp

Out[28]= 886.044 + 240.451 Kd + 618596. Ki + 1.31221*10^6 Kp

Out[29]= 0.162357 + 1.31221*10^6 Ki + 240.451 Kp

Out[30]= 240.451 Ki


Routh = ( {
{S7, S5, S3, S1},
{S6, S4, S2, S0},
{b1, b2, b3, 0},
{c1, c2, c3, 0},
{d1, d2, 0, 0},
{e1, e2, 0, 0},
{f1, 0, 0, 0},
{S0, 0, 0, 0}
} )


b1 = -(Det[Routh[[{1, 2}, {1, 2}]]]/S6)
b2 = -(Det[Routh[[{1, 2}, {1, 3}]]]/S6)
b3 = -(Det[Routh[[{1, 2}, {1, 4}]]]/S6)
c1 = -(Det[Routh[[{2, 3}, {1, 2}]]]/b1)
c2 = -(Det[Routh[[{2, 3}, {1, 3}]]]/b1)
c3 = -(Det[Routh[[{2, 3}, {1, 4}]]]/b1)
d1 = -(Det[Routh[[{3, 4}, {1, 2}]]]/c1)
d2 = -(Det[Routh[[{3, 4}, {1, 3}]]]/c1)
e1 = -(Det[Routh[[{4, 5}, {1, 2}]]]/d1)
e2 = -(Det[Routh[[{4, 5}, {1, 3}]]]/d1)
f1 = -(Det[Routh[[{5, 6}, {1, 2}]]]/e1)
S0 = S0 = (Out[23])[[1]]


ex = Expand[Pd = (s*10)^2*(s + 3)^3*3*(s + 1)^2 + s*10 + 150]

CoeffPcl = CoefficientList[Pcl, s]
CoeffPd = CoefficientList[Pd, s]


FindInstance[{CoeffPcl[[1]] - CoeffPd[[1]] == 0}, {Ki, Kp, Kd}]
FindInstance[{CoeffPcl[[2]] - CoeffPd[[2]] == 0}, {Kp, Kd, Ki}]
FindInstance[{CoeffPcl[[3]] - CoeffPd[[3]] == 0}, {Kd, Ki, Kp}]
FindInstance[{CoeffPcl[[4]] - CoeffPd[[4]] == 0}, {Ki, Kp, Kd}]
FindInstance[{CoeffPcl[[5]] - CoeffPd[[5]] == 0}, {Ki, Kp, Kd}]
FindInstance[{CoeffPcl[[6]] - CoeffPd[[6]] == 0}, {Ki, Kp, Kd}]
FindInstance[{CoeffPcl[[7]] - CoeffPd[[7]] == 0}, {Ki, Kp, Kd}]
FindInstance[{CoeffPcl[[8]] - CoeffPd[[8]] == 0}, {Ki, Kp, Kd}]

KiKpKd = FindInstance[
Reduce[S7 > 0 && S6 > 0 && S0 > 0 && b1 > 0 && c1 > 0 && d1 > 0 &&
e1 > 0 && f1 > 0, {Ki, Kp, Kd}], {Ki, Kp, Kd}]

somone
19-04-12, 23:51
Λοιπόν, σχετικά με τις ορίζουσες θα το κάνεις ως εξης:

fb1 = -(Det[Routh[[{1, 2}, {1, 2}]]]/S6)
fb2 = -(Det[Routh[[{1, 2}, {1, 3}]]]/S6)
fb3 = -(Det[Routh[[{1, 2}, {1, 4}]]]/S6)
fc1 = -(Det[Routh[[{2, 3}, {1, 2}]]]/b1)
fc2 = -(Det[Routh[[{2, 3}, {1, 3}]]]/b1)
fc3 = -(Det[Routh[[{2, 3}, {1, 4}]]]/b1)
fd1 = -(Det[Routh[[{3, 4}, {1, 2}]]]/c1)
fd2 = -(Det[Routh[[{3, 4}, {1, 3}]]]/c1)
fe1 = -(Det[Routh[[{4, 5}, {1, 2}]]]/d1)
fe2 = -(Det[Routh[[{4, 5}, {1, 3}]]]/d1)
ff1 = -(Det[Routh[[{5, 6}, {1, 2}]]]/e1)

και μετά θα αντικαταστήσεις αυτά στα b1 b2 κλπ. δηλαδή μετά κάνεις


b1 = fb1; b2=fb2; b3=fb3 κλπ.

Αυτό γιατί τα b1 b2 κλπ είναι μέσα στον πίνακα Routh και έτσι όπως το έχεις τώρα κάθε φορά που υπολογίζεται μια ορίζουσα αυτά πέρνουν τιμές και έτσι ο πίνακας γίνεται πιο πολύπλοκος για τον υπολογισμό των επόμενων οριζουσών.

Για το τελικό αποτέλσμα τώρα αυτή η σχέση

S7 > 0 && S6 > 0 && S0 > 0 && b1 > 0 && c1 > 0 && d1 > 0 && e1 > 0 && f1 > 0, {Ki, Kp, Kd}
που θες να λύσεις είναι αρκετά πολύπλοκη αν δεις την εξίσωση που αντιπροσωπεύει το κάθε ένα απο αυτά τα σύμβολα. Μπορείς να δοκιμάσεις να αφήσεις τo mathematica για κάποιο χρονικό διάστημα μήπως και την λύσει αλλιώς θα πρέπει με κάποιο τρόπο να απλοποιήσεις τα πράγματα. Τώρα το πως θα γίνει αυτό δεν το ξέρω, ίσως να συζητήσεις με τον καθηγητή σου. Επίσης το S0 = S0 = (Out[23])[[1]] πάλι δεν βλέπω να το έχεις αλλάξει.

tripodous
20-04-12, 13:18
Λοιπόν, σχετικά με τις ορίζουσες θα το κάνεις ως εξης:

fb1 = -(Det[Routh[[{1, 2}, {1, 2}]]]/S6)
fb2 = -(Det[Routh[[{1, 2}, {1, 3}]]]/S6)
fb3 = -(Det[Routh[[{1, 2}, {1, 4}]]]/S6)
fc1 = -(Det[Routh[[{2, 3}, {1, 2}]]]/b1)
fc2 = -(Det[Routh[[{2, 3}, {1, 3}]]]/b1)
fc3 = -(Det[Routh[[{2, 3}, {1, 4}]]]/b1)
fd1 = -(Det[Routh[[{3, 4}, {1, 2}]]]/c1)
fd2 = -(Det[Routh[[{3, 4}, {1, 3}]]]/c1)
fe1 = -(Det[Routh[[{4, 5}, {1, 2}]]]/d1)
fe2 = -(Det[Routh[[{4, 5}, {1, 3}]]]/d1)
ff1 = -(Det[Routh[[{5, 6}, {1, 2}]]]/e1)

και μετά θα αντικαταστήσεις αυτά στα b1 b2 κλπ. δηλαδή μετά κάνεις


b1 = fb1; b2=fb2; b3=fb3 κλπ.

Αυτό γιατί τα b1 b2 κλπ είναι μέσα στον πίνακα Routh και έτσι όπως το έχεις τώρα κάθε φορά που υπολογίζεται μια ορίζουσα αυτά πέρνουν τιμές και έτσι ο πίνακας γίνεται πιο πολύπλοκος για τον υπολογισμό των επόμενων οριζουσών.

Για το τελικό αποτέλσμα τώρα αυτή η σχέση

S7 > 0 && S6 > 0 && S0 > 0 && b1 > 0 && c1 > 0 && d1 > 0 && e1 > 0 && f1 > 0, {Ki, Kp, Kd}
που θες να λύσεις είναι αρκετά πολύπλοκη αν δεις την εξίσωση που αντιπροσωπεύει το κάθε ένα απο αυτά τα σύμβολα. Μπορείς να δοκιμάσεις να αφήσεις τo mathematica για κάποιο χρονικό διάστημα μήπως και την λύσει αλλιώς θα πρέπει με κάποιο τρόπο να απλοποιήσεις τα πράγματα. Τώρα το πως θα γίνει αυτό δεν το ξέρω, ίσως να συζητήσεις με τον καθηγητή σου. Επίσης το S0 = S0 = (Out[23])[[1]] πάλι δεν βλέπω να το έχεις αλλάξει.
Ναι το τελευτιαο S0 δεν το ειχα προσεξει καλως.Οσο για τα αλλα ο μονος τροπος να το υπο΄λογισω θελει με mathematica μονο ο καθηγητης.Και το θεμα ειναι οτι πρεπει να μ βγαλει οπωςδηοοτε τις τιμες των οριζουσων αλλιως δδεν θα μ δουλευει η τελευταια εντολη και δεν θ αμ βγαζει αποτελεσμα ,δλδ μια τυχαια τιμη Κi,Kp,Kd που να ικανοποιει την συνθηκη ωστε να ειναι ευσταθες.Οκ ευχαριστω παντωσ θα δω τι 8α κανω

somone
20-04-12, 19:16
Διάβασε πιο προσεκτικά τι γράφω, τις ορίζουσες με το mathematica θα τις βγάλεις, απλά στο πρόγραμμά σου θα κάνεις την αλλαγή που σου λεω παραπάνω.

tripodous
21-04-12, 01:39
Διάβασε πιο προσεκτικά τι γράφω, τις ορίζουσες με το mathematica θα τις βγάλεις, απλά στο πρόγραμμά σου θα κάνεις την αλλαγή που σου λεω παραπάνω.
το εκανα ρε φιλε και παλι δεν δουλευει , αν εχεις μαθεματικα και μπορεισ να το τρεξεις παλι θα δεις δεν τρεχει κολλαει στο τελοσ

somone
21-04-12, 12:13
Μα σου είπα στο προηγούμενο post οτι η τελευταία σχέση στο πρόγραμμα σου είναι πολύ περίπλοκη. Η αλλαγή που σου πρότεινα είναι για να βρεις τις ορίζουσες. Είναι ένα βήμα κ αυτό αφου πριν ούτε αυτές μπορούσες να βρεις.

Μέχρι πόση ώρα άφησες το mathematica να προσπαθήσει για την τελευταία σχέση; Ίσως αν το αφήσεις αρκετά να τη λύσει, 1, 2 ώρες πχ.

tripodous
21-04-12, 22:31
Μα σου είπα στο προηγούμενο post οτι η τελευταία σχέση στο πρόγραμμα σου είναι πολύ περίπλοκη. Η αλλαγή που σου πρότεινα είναι για να βρεις τις ορίζουσες. Είναι ένα βήμα κ αυτό αφου πριν ούτε αυτές μπορούσες να βρεις.

Μέχρι πόση ώρα άφησες το mathematica να προσπαθήσει για την τελευταία σχέση; Ίσως αν το αφήσεις αρκετά να τη λύσει, 1, 2 ώρες πχ.

lol οχι μερικα λεπτα το αφησα και μια φορα μου εβγαλε το MEMOR?Y επειδη ετρεχαν και καλα πολλα προγραμματα,αλλα τεσπα ανα θελει τοσο πολυ για να κανει τις πραξεις ζητω που καηκαμε!δεν μπορω να περιμενω ωρα.Και οσο για τις οριζουσες τις βγαζει απλα την τελευται f1 αργει λιγο σε σχεση με τις αλλες, αλλα κατα τα αλλα τισ βρισκει ολες πως..