Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <math.h>
- #define A 40.5322
- #define B -71080.3
- #define C -2.49974
- #define D 3.4742e-4
- #define E -1.5409e-8
- #define F 3.9912e5
- #define e 1e-6
- #define dl 1e-10
- double k(double t) {
- return exp(A + (B / t) + (C * log(t)) + (D * t) + (E * pow(t, 2.0)) + (F / pow(t, 2.0)));
- }
- double f(double p, double t, double v_a, double v_b, double v_c, double x) {
- return (((v_c + x) * pow((v_b + 2 * x), 2.0) * p) - (k(t) * pow((v_a - 2 * x), 2.0) * (v_a + v_b + v_c + x)));
- }
- double sign(double x) {
- return (x / fabs(x));
- }
- int main(int argc, char *argv[]) {
- double v_a, v_b, v_c; // v_a = CO2
- // v_b = CO
- // v_c = O2
- double t; // temperature
- double p; // pressure
- printf("Температура (К) = "); scanf("%lf", &t);
- printf("Давление (атм) = "); scanf("%lf", &p);
- putchar('\n');
- printf("Количество CO₂ (моль) = "); scanf("%lf", &v_a);
- printf("Количество CO (моль) = "); scanf("%lf", &v_b);
- printf("Количество O₂ (моль) = "); scanf("%lf", &v_c);
- double a, b, c, x; // variables for calculations
- if (-(v_b / 2) > -v_c)
- a = -(v_b / 2);
- else
- a = -v_c;
- b = v_a / 2;
- do {
- c = a + (b - a) / 2;
- double tmp = f(p, t, v_a, v_b, v_c, c);
- if (tmp == 0.0 || fabs(tmp) <= dl) {
- x = c;
- break;
- }
- if ((b - a) <= e) {
- x = c;
- break;
- }
- if (sign(f(p, t, v_a, v_b, v_c, a)) * sign(tmp) < 0)
- b = c;
- else
- a = c;
- } while (1);
- double s = v_a + v_b + v_c + x;
- putchar('\n');
- printf("\tНачальные количества\tРавновесные количества\tПарциальное давление\n");
- printf("CO₂\t%-20.4lf\t%-22.4lf\t%-20.4e\n", v_a, v_a - 2 * x, (v_a - 2 * x) / s * p);
- printf("CO\t%-20.4lf\t%-22.4lf\t%-20.4e\n", v_b, v_b + 2 * x, (v_b + 2 * x) / s * p);
- printf("O₂\t%-20.4lf\t%-22.4lf\t%-20.4e\n", v_c, v_c + x, (v_c + x) / s * p);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment