Routh aglorithm

//Tiêu chuẩn Routh nhằm kiểm tra tính ổn định của hệ thống điều khiển thông qua đa thức đặc trưng A(p).

#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;

class DTDT {
——-float A[40]; //da thuc dac trung co bac toi da la 39
——-float B[40][20];//ma trận này để thao tác với bảng Routh
——-int n; //cái này sẽ quy định bậc của đa thức đặc trưng
public:
——-DTDT(); //ham khoi tao cac gia tri cho ma tra A va B
——-void NhapDTDT(char *);
——-int KT_DieuKienCan(int); //han kiem tra DK can cua dinh luat Routh
——-void Routh();
——-void InKetLuan(char *); //in ra kl khi dk can duoc thoa man va da thuc hien thuat  toan Routh
——-void InKetLuan1(char *); //in ra ket luan khi dieu khien can bi vi pham
};
DTDT::DTDT(){
——-n=0;
——-for(int i=0;i<40;i++)
——-A[i] = 0;
——-for(int i=0;i<40;i++)
————–for(int j=0;j<20;j++)
———————B[i][j] = 0;
}
void DTDT::NhapDTDT(char *NameFile1){
——-ifstream dataFile(NameFile1);
——-if(!dataFile.fail()){
————–dataFile>>n; //doc duoc gia tri ‘n’ la so cac thua so cua da thuc dac trung A(p)
————–cout<<” n= “<<n<<”\n”; //hien thi gia tri ‘n’ len man hinh.
————–for(int i=0;i<=n;i++)
———————dataFile>>A[i]; //doc cac gia tri a[i] cua da thuc dac trung tren tep
——-}
——-else{
————–cout<<”\nError : open file “<<NameFile1<<” is fail;\n”;
————–exit(1);
——-}
——-dataFile.close();
}
int DTDT::KT_DieuKienCan(int a = 0){
——-for(int i=0;i<n;i++){
——-if(A[i]<=0){
———————a = 1;
———————break;
————–}
————–else
———————continue;
——-}
——-return a;
}

//thực hiện thuật toán Routh như sau
void DTDT::Routh(){
——-for(int i=0;i<2;i++){
————–for(int j=0;j<(n/2+1);j++){
———————if(i==0) //với dòng đầu tiên
—————————-B[i][j] = A[j*2]; //gán cho nó các giá trị A0,A2,A4…
———————else
—————————-B[i][j] = A[j*2+1]; //với dòng thứ 2 gán các giá trị A1,A3,A5…
————–}
——-}
——-for(int i=2;i<=n;i++){
————–for(int j=0;j<(n/2+1);j++){
———————if(j==0) //thao tác trên cột đầu tiên của bảng routh
—————————-B[i][j] = B[i-1][j]*B[i-2][j+1]-B[i-2][j]*B[i-1][j+1];
———————else //cột khác thì làm như sau.
—————————-B[i][j] = B[i-1][j-1]*B[i-2][j+1]-B[i-2][j-1]*B[i-1][j+1];
————–}
——-}
——-cout<<”\nDa thuc hien thuat toan Routh va ket qua cho ra nhu sau:\n”;
——-for(int i=0;i<=n;i++){
————–for(int j=0;j<(n/2+1);j++)
———————cout<<setw(10)<<B[i][j];
————–cout<<”\n”;
——-}
}

//hàm này dóng vai trò quan trọng không kém hàm trên. Nó có vẻ khó cài đặt hơn vì phải dùng đến các lệnh //break, continue, các if-else hợp lý thì mới cho ra kết luận đúng.
void DTDT::InKetLuan(char *NameFile2){
——-ofstream dataFile(NameFile2);
——-if(dataFile.is_open()){
——-for(int i=2;i<=n;i++){
//nếu bất cứ giá trị nào ở cột đầu tiên bằng ‘0’ hoặc giá trị cuối cùng <0 cũng đề không thể ổn định được

————–if(((i!=n)&&(B[i][0]<=0))||(B[n][0] <0)){
———————dataFile<<”\nHe thong DK la khong on dinh\n”;
———————cout<<”\nHe thong DK la khong on dinh\n”;
———————break; //phải thoá ra luôn khi đã có kết luận hệ kô ổn định
————–}
————–else
———————if(B[n][0]==0){ //chỉ có một giái trị cuối cùng của dòng thứ nhất = 0
—————————-dataFile<<”\nHe thong DK la o ranh gioi cua su on dinh\n”; //in ra file
—————————-cout<<”\nHe thong DK la o ranh gioi cua su on dinh\n”; //in ra màn hình
—————————-break; //cũng phải thoát ra luôn
———————}
———————-else
—————————-if(i!=n) //nếu chưa đến giá trị cuối của dòng đầu trong bảng Routh
———————————–continue;
—————————-else{ //nếu đã xét hết các giá trị mà các giá trị đều >0
———————————–dataFile<<”\nHe thong DK la on dinh\n”;
———————————–cout<<”\nHe thong DK la on dinh\n”;
—————————-}

———————}
——-}
——–dataFile.close();
}

//hàm sau kiểm tra điều kiện cần của định luật Routh nếu không thoả mãn cho ra kết luận luôn
void DTDT::InKetLuan1(char *NameFile2){
——-ofstream dataFile(NameFile2);
——-dataFile<<”\nHe thong dk la khong on dinh do khong thoa man dk can cua DL Routh\n”;
——-cout<<”\nHe thong dk khong on dinh do khong thoa man dk can cua DL Routh\n”;
——-dataFile.close();
}


//Nếu bạn băn khoan về thuật toánn hãy cho tôi biết.

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s