/* PRIVOD1 Программа решения систем дифференциальных уравнений методом Рунге-Кутта 4-го порядка. ВХОДНЫЕ ДАННЫЕ: N-число уравнений; h-шаг интегрирования; t-начальное время; y[i]-массив начальных значений переменных (i=0,1,2,...,N); функция вычисления правых частей дифференциальных уравнений-f; ВЫХОДНЫЕ ДАННЫЕ: Результат после одного шага решения в массиве начальных значений переменных y[i];текущее время-t. ВНУТРЕННИЕ ПЕРЕМЕННЫЕ: py[i]-массив значений правых частей; y0[i],y1[i],y2[i]-масивы для хранения промежуточных значений переменных; t0-время в начале шага; i,N-целочисленные переменные. При использовании данной программы в качестве вызываемой функции необходимо описать одномерные массивы y,y0,y1,y2,py размером N (все описания даются с учётом нулевых значений индексов). Объявить типы переменных t,h,h1,y,i,N. */ #include <fstream> #include <iostream> //библиотечные функции #include <iomanip> #include <math.h> using namespace std; void f(double t,double y[],double py[]);//прототип функции int main() { const int N=13; //число дифференциальных ур-ий double y[N]={0}; //начальные условия double y0[N]; double y1[N]; double y2[N]; double py[N]; double t0=0,t=0,h,h1; h=0.001; //шаг интегрирования int v=20; //ширина поля печати int w=9; //число знаков //---------функции управления выводом данных----- ofstream fout("1.txt"); cout.precision(w); cout.setf(ios::left,ios::adjustfield); fout<<setiosflags(ios::fixed); //----------вывод на экран----------------- cout<<"Programma C++ METOD RUNGE-KUTTA "<<endl<<endl; cout<<setw(v)<<"t"<<setw(v)<<"y11"<<setw(v)<<"y12"<<endl; cout<<setw(v)<<t<<setw(v)<<y[11]<<setw(v)<<y[12]<<endl; //----------вывод в текстовый файл---------- fout<<setw(v)<<t<<setw(v)<<y[11]<<setw(v)<<y[12]<<endl; for (int k=0;k<20;k++) //количество точек на экране { for (int m=0;m<5;m++) //число внутренних шагов интегрирования { t0=t; //t=tn for (int i=0;i<N;i++) //загрузка y0,y2 { y0[i]=y[i]; y2[i]=y[i]; }; /*------1-й цикл-------------*/ h1=h/2; f(t,y,py); for (int i=0;i<N;i++) { y1[i]=py[i]*h1; //y1=h/2*f(tn,yn)=K1/2 y[i]=y0[i]+y1[i]; //y=yn+K1/2 y2[i]=y2[i]+y1[i]/3;//y2=yn+K1/6 }; /*------2-й цикл--------------*/ t=t0+h1; //t=tn+h/2 f(t,y,py); for (int i=0;i<N;i++) { y1[i]=py[i]*h1; //y1=h/2*f(tn+h/2,yn+K1/2)=K2/2 y[i]=y0[i]+y1[i]; //y=yn+K2/2 y2[i]=y2[i]+y1[i]*2/3;//y2=yn+K1/6+K2/3 }; /*-------3-й цикл---------------*/ f(t,y,py); for (int i=0;i<N;i++) { y1[i]=py[i]*h; //h*f(tn+h/2,yn+K2/2)=K3 y[i]=y0[i]+y1[i]; //y=yn+K3 y2[i]=y2[i]+y1[i]/3;//y2=yn+K1/6+K3/3 }; /*-------4-й цикл----------------*/ t=t0+h; //t=tn+h f(t,y,py); for (int i=0;i<N;i++) { y1[i]=py[i]*h1; //y1=h/2*f(tn+h,yn+K3)=K4/2 y[i]=y2[i]+y1[i]/3; //y=yn+K1/6+K2/3+K3/3+K4/6 }; //----------вывод в текстовый файл---------- fout<<setw(v)<<t<<setw(v)<<y[11]<<setw(v)<<y[12]<<endl; }; //----------вывод на экран----------------- cout<<setw(v)<<t<<setw(v)<<y[11]<<setw(v)<<y[12]<<endl; }; fout.close(); return(0); } void f(double t,double y[],double py[]) //Функция вычисления //правых частей ДУ { double Uv=10, Ky=10, Ty=0.003, R=0.0317, L=0.000337, J=0.242, C=1.127; double Kp=1/R, Tp=L/R, Kd=1/J, Koc=0.0478, Mn=76.4, Kot=C/10.5, Ti=0.002; double Kpt=(Tp-Ti)/(Ti*Ky*Kp*Kot), Kv=1/Koc, Ki=(Kpt*Ky*Kp)/(1+Kpt*Ky*Kp*Kot); double Tv=0.002, Kpc=1/(Tv*Ki*Kd*Koc*C); double U0=0,U1=0,U2=0,U3=0,U4=0,U5=0,U6=0,U7=0,U8=0,U9=0,U10=0,U11=0,U12=0; //коэффициенты U5=Uv-Koc*y[12]-y[7]; //уравнения связи U6=y[5]; U7=U5-y[6]; U8=Kpc*U5-Kot*y[11]-y[9]; U9=U8-y[8]; U10=Kpt*U8; U11=y[10]-C*y[12]; U12=C*y[11]-Mn; py[0]=0; //система ДУ py[1]=0; py[2]=0; py[3]=0; py[4]=0; py[5]=(U5-y[5])/Ty; py[6]=(U6-y[6])/Ti; py[7]=Kpc*Ki*C*Kd*Koc*U7; py[8]=(U8-y[8])/Ty; py[9]=(Kpt*Ky*Kp*Kot*U9-y[9])/Tp; py[10]=(Ky*U10-y[10])/Ty; py[11]=(Kp*U11-y[11])/Tp; py[12]=Kd*U12; }
Write, Run & Share C++ code online using OneCompiler's C++ online compiler for free. It's one of the robust, feature-rich online compilers for C++ language, running on the latest version 17. Getting started with the OneCompiler's C++ compiler is simple and pretty fast. The editor shows sample boilerplate code when you choose language as C++
and start coding!
OneCompiler's C++ online compiler supports stdin and users can give inputs to programs using the STDIN textbox under the I/O tab. Following is a sample program which takes name as input and print your name with hello.
#include <iostream>
#include <string>
using namespace std;
int main()
{
string name;
cout << "Enter name:";
getline (cin, name);
cout << "Hello " << name;
return 0;
}
C++ is a widely used middle-level programming language.
When ever you want to perform a set of operations based on a condition If-Else is used.
if(conditional-expression) {
//code
}
else {
//code
}
You can also use if-else for nested Ifs and If-Else-If ladder when multiple conditions are to be performed on a single variable.
Switch is an alternative to If-Else-If ladder.
switch(conditional-expression){
case value1:
// code
break; // optional
case value2:
// code
break; // optional
......
default:
code to be executed when all the above cases are not matched;
}
For loop is used to iterate a set of statements based on a condition.
for(Initialization; Condition; Increment/decrement){
//code
}
While is also used to iterate a set of statements based on a condition. Usually while is preferred when number of iterations are not known in advance.
while (condition) {
// code
}
Do-while is also used to iterate a set of statements based on a condition. It is mostly used when you need to execute the statements atleast once.
do {
// code
} while (condition);
Function is a sub-routine which contains set of statements. Usually functions are written when multiple calls are required to same set of statements which increases re-usuability and modularity. Function gets run only when it is called.
return_type function_name(parameters);
function_name (parameters)
return_type function_name(parameters) {
// code
}