Пиковое значение и погрешность расчета для Рунге Кутты
Мне пришлось вычислять дифференциальное уравнение по времени с помощью метода Рунге-Кутты. Я приложил свой код, но мне нужна дополнительная помощь, чтобы также найти пиковое значение в момент времени 43 секунды в коде. Мне нужна помощь в том, как приблизиться к пиковому значению Z().
#include <stdio.h> #include <conio.h> #include <time.h> #include <math.h> #include <stdlib.h> #include "winbgi2.h" #define n 3 #define dist 0.1 #define max 50 void rungekutta(double x, double y[], double step); double fun(double x, double y[], int i); void main() { graphics(50,30); double t, z[n]; int j; FILE *f; fopen_s(&f, "padela.txt", "w+"); t = 0.0; z[0] = 0; z[1] = 0; z[2] = 0; fprintf(f,"time\t\tZ-axis\n"); fprintf(f, "%lf\t\t%lf\n",t,z[2]); for (j = 1; j*dist <= max; j++) { t = j*dist; rungekutta(t,z,dist); fprintf(f, "%lf\t\t%lf\n",t,z[2]); circle(t+200,z[2]+200,7); } fclose(f); getch(); } void rungekutta(double x, double z[], double step) { double h = step / 2.0, t1[n], t2[n], t3[n], k1[n], k2[n], k3[n], k4[n]; int i; for (i = 0; i<n; i++) { t1[i] = z[i] + 0.5*(k1[i] = step*fun(x, z, i)); } for (i = 0; i<n; i++) { t2[i] = z[i] + 0.5*(k2[i] = step*fun(x + h, t1, i)); } for (i = 0; i<n; i++) { t3[i] = z[i] + (k3[i] = step*fun(x + h, t2, i)); } for (i = 0; i<n; i++) { k4[i] = step*fun(x + step, t3, i); } for (i = 0; i<n; i++) { z[i] += (k1[i] + 2 * k2[i] + 2 * k3[i] + k4[i]) / 6.0; } } double fun(double x, double z[], int i) { double a=0.2,b=0.2,c=5.7; if (i == 0) { return -z[1]-z[2]; } if (i == 1) { return z[0]+(a*z[1]); } if (i == 2) { return b+(z[2]*(z[0]-c)); } }
Что я уже пробовал:
Мне нужна помощь в том, как приблизиться к пиковому значению Z().
Richard MacCutchan
Это ваш третий пост с этим вопросом, удалили ли вы предыдущие версии, которые уже дали вам решения?