×
Samples Blogs Make Payment About Us Reviews 4.9/5 Order Now

Program to Solve ODE Equation in C++ Assignment Solution

July 08, 2024
Brian M. Powell
Brian M.
🇺🇸 United States
C++
Brian M. Powell, PhD in Computer Science from a distinguished Austrian university, with 8 years of expertise in C++ assignments. Specializes in advanced algorithm development and software engineering, delivering robust solutions for academic and professional projects.
Key Topics
  • Instructions
  • Requirements and Specifications
Tip of the day
Familiarize yourself with OCaml's pattern matching; it simplifies handling recursive data structures like lists and trees, making your code concise and easier to debug.
News
In 2024, Girls Who Code introduced a Data Science + AI track in their free summer programs for high school students, fostering skills in cybersecurity and creative coding​

Instructions

Objective

Write a program to solve ODE equation in C++ language.

Requirements and Specifications

program to solve ODE equation in C++
program to solve ODE equation in C++ 1
program to solve ODE equation in C++ 2

Source Code

#include #include #include #include #include #include #include using namespace std; // define the size of arrays here. This is also the number of points #define SIZE 5000 // We will create a class that will be useful to store the solution at each time step class V0 { private: float time; // time value float value; // value of voltage public: V0() { time = 0; value = 0; }; V0(float v, float t) { time = t; value = v; } // getters float getTime() {return time;} float getValue() {return value;} }; V0 Vnew_forward(vector V0arr, float Vs, float dt, int i) { /* Given the index i, the vector V and time-step dt, this function calculates the new Value at the inex i+1 according to the Forward Difference method This function basically calculates the value of the Voltage at index i+1 (or x +dx) */ float input = 5*Vs; float V0i_term = V0arr[i].getValue()*(5 - 2/pow(dt,2) - 2/dt); // i term float V0im1_term = V0arr[i-1].getValue()*(1/pow(dt,2)); // i-1 term float divisor = 1/pow(dt,2) + 2/dt; float val = (input - V0i_term - V0im1_term)/divisor; return V0(val, (i+1)*dt); } V0 Vnew_backward(vector V0arr, float Vs, float dt, int i) { /* Given the index i, the vector V and time-step dt, this function calculates the new Value at the inex i+1 according to the Central Difference method This function basically calculates the value of the Voltage at index i+1 (or x +dx) */ float input = 5*Vs; float V0i_term = V0arr[i].getValue()*(5 - 2/pow(dt,2) + 2/dt); // i term float V0im1_term = V0arr[i-1].getValue()*(1/pow(dt,2) - 2/dt); // i-1 term float val = (input - V0i_term - V0im1_term)*pow(dt,2); return V0(val, (i+1)*dt); } V0 Vnew_central(vector V0arr, float Vs, float dt, int i) { /* Given the index i, the vector V and time-step dt, this function calculates the new Value at the inex i+1 according to the Forward Difference method This function basically calculates the value of the Voltage at index i+1 (or x +dx) */ float input = 5*Vs; float V0i_term = V0arr[i].getValue()*(5 - 2/pow(dt,2)); // i term float V0im1_term = V0arr[i-1].getValue()*(1/pow(dt,2) - 1/dt); // i-1 term float divisor = 1/pow(dt,2) + 1/dt; float val = (input - V0i_term - V0im1_term)/divisor; return V0(val, (i+1)*dt); } vector forward_difference(float Vinit, float Vs, float dt) { // First, create the vector vector Vsol; Vsol.push_back(V0(Vinit, 0)); Vsol.push_back(V0(Vinit, dt)); for(int i = 1; i < SIZE-1; i++) { V0 V0new = Vnew_forward(Vsol, Vs, dt, i); Vsol.push_back(V0new); } return Vsol; } vector backward_difference(float Vinit, float Vs, float dt) { // First, create the vector vector Vsol; Vsol.push_back(V0(Vinit, 0)); Vsol.push_back(V0(Vinit, dt)); for(int i = 1; i < SIZE-1; i++) { V0 V0new = Vnew_backward(Vsol, Vs, dt, i); Vsol.push_back(V0new); } return Vsol; } vector central_difference(float Vinit, float Vs, float dt) { // First, create the vector vector Vsol; Vsol.push_back(V0(Vinit, 0)); Vsol.push_back(V0(Vinit, dt)); for(int i = 1; i < SIZE-1; i++) { V0 V0new = Vnew_central(Vsol, Vs, dt, i); Vsol.push_back(V0new); } return Vsol; } float Vanalytic(float t) { /* Return the analytic solution at time t */ float V =10 - exp(-t)*(10*cos(2*t) + 5*sin(2*t)); return V; } int main() { // Variable to store the name of the output file string file_name; // Ask for filename cout << "Enter output file: "; getline(cin, file_name); // Define parameters here like input value (source), initial condition, initial time, final time and time step float Vinit = 0; // V at t = 0 float V0p = 0; // first derivative of V at t = 0 float Vs = 10; // Define the final time of simulation float tf = 5.0; // in seconds // Calculate step float dt = tf/(float)SIZE; // Solve using the different methods vector V0sol_forward = forward_difference(Vinit, Vs, dt); vector V0sol_backward = backward_difference(Vinit, Vs, dt); vector V0sol_central = central_difference(Vinit, Vs, dt); // Create array to store time float *Van = new float[SIZE]; float *t= new float[SIZE]; // Calculate all the values for the next time-steps t[0] = 0; for(int i = 1; i < SIZE; i++) { // Store also the time values t[i] = t[i-1] + dt; } // open output file ofstream oFile(file_name); // Print headers cout << left << setw(10) << "Time" << right << setw(20) << "Backward" << setw(20) << "Forward" << setw(20) << "Central" << setw(20) << "V0 - analytical" << endl; cout << left << setw(10) << "----" << right << setw(20) << "--------" << setw(20) << "-------" << setw(20) << "-------" << setw(20) << "---------------" << endl; // Write header to output file //oFile << "time,Vsolution,Vanalytical"< // Loop through all the values and append to the file // Print every 100 values to the console // Create variables to store maximum and minimum voltages, and their times V0 V0max_forward; V0 V0max_backward; V0 V0max_central; V0 V0min_forward; V0 V0min_backward; V0 V0min_central; // Define here the number of values at which the lines will be printed int Nlines = 100; for(int i = 0; i < SIZE; i++) { Van[i] = Vanalytic(t[i]); // Calculate the analytic solution for time i // Write output file as a csv file oFile << t[i] << "," << V0sol_forward[i].getValue() << "," << V0sol_backward[i].getValue() << "," << V0sol_central[i].getValue() << "," << Van[i] << endl; if(i%Nlines == 0) {// Print only every 100 values cout << left << setw(10) << t[i] << right << setw(20) << V0sol_forward[i].getValue() << setw(20) << V0sol_backward[i].getValue() << setw(20) << V0sol_central[i].getValue() << setw(20) << Van[i] << endl; } if(V0sol_forward[i].getValue() < V0min_forward.getValue()) // voltage i is lower than the minimum voltage registered { V0min_forward = V0sol_forward[i]; } if(V0sol_backward[i].getValue() < V0min_backward.getValue()) // voltage i is lower than the minimum voltage registered { V0min_backward = V0sol_backward[i]; } if(V0sol_central[i].getValue() < V0min_central.getValue()) // voltage i is lower than the minimum voltage registered { V0min_central = V0sol_central[i]; } if(V0sol_forward[i].getValue() > V0max_forward.getValue()) // voltage i is lower than the minimum voltage registered { V0max_forward = V0sol_forward[i]; } if(V0sol_backward[i].getValue() > V0max_backward.getValue()) // voltage i is lower than the minimum voltage registered { V0max_backward = V0sol_backward[i]; } if(V0sol_central[i].getValue() > V0max_central.getValue()) // voltage i is lower than the minimum voltage registered { V0max_central = V0sol_central[i]; } } // Display max and min cout << endl << "The maximum voltage obtained using Forward Difference Method is " << V0max_forward.getValue() << " (V) and it happened at t = " << V0max_forward.getTime() << " (s)" << endl; cout << "The minimum voltage obtained using Forward Difference Method is " << V0min_forward.getValue() << " (V) and it happened at t = " << V0min_forward.getTime() << " (s)" << endl; cout << endl << "The maximum voltage obtained using Backward Difference Method is " << V0max_backward.getValue() << " (V) and it happened at t = " << V0max_backward.getTime() << " (s)" << endl; cout << "The minimum voltage obtained using Backward Difference Method is " << V0min_backward.getValue() << " (V) and it happened at t = " << V0min_backward.getTime() << " (s)" << endl; cout << endl << "The maximum voltage obtained using Central Difference Method is " << V0max_central.getValue() << " (V) and it happened at t = " << V0max_central.getTime() << " (s)" << endl; cout << "The minimum voltage obtained using Central Difference Method is " << V0min_central.getValue() << " (V) and it happened at t = " << V0min_central.getTime() << " (s)" << endl; oFile.close(); // Finally delete the vectors delete[] t; delete[] Van; V0sol_backward.clear(); V0sol_forward.clear(); V0sol_central.clear(); }

Similar Samples

Explore our sample programming assignments to see the quality and depth of our work. Each example demonstrates our expertise across various languages and complexities, ensuring you receive top-notch assistance tailored to your needs.