Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ЧМЫ5.cpp: определяет точку входа для консольного приложения.
- //
- #include <iostream>
- #include <cmath>
- using namespace std;
- double f1(double x1, double x2) {
- return exp(x1*x2) + x1 - 6;
- }
- double f2(double x1, double x2) {
- return x1*x1 - 6 * x2 - 1;
- }
- double f1_d1(double x1, double x2) {
- return x2*exp(x1*x2) + 1;
- }
- double f1_d2(double x1, double x2) {
- return x1*exp(x1*x2);
- }
- double f2_d1(double x1, double x2) {
- return 2 * x1;
- }
- double f2_d2(double x1, double x2) {
- return -6;
- }
- double x[2], x_prev[2];
- double slau[2][3];
- int slaufill() {
- slau[0][0] = f1_d1(x_prev[0],x_prev[1]);
- slau[0][1] = f1_d2(x_prev[0], x_prev[1]);
- slau[1][0] = f2_d1(x_prev[0], x_prev[1]);
- slau[1][1] = f2_d2(x_prev[0], x_prev[1]);
- slau[0][2] = -f1(x_prev[0], x_prev[1]);
- slau[1][2] = -f2(x_prev[0], x_prev[1]);
- return 0;
- }
- int slausolve_nextstep() {
- int i;
- double koef;
- koef = -slau[1][0] / slau[0][0];
- for (i = 0; i < 3; i++)
- slau[1][i] = slau[1][i] + slau[0][i] * koef;
- slau[1][2] = slau[1][2] / slau[1][1];
- slau[0][2] = (slau[0][2] - slau[0][1] * slau[1][2]) / slau[0][0];
- for (i = 0; i < 2; i++)
- x[i] = x_prev[i] + slau[i][2];
- return 0;
- }
- double maxdiff() {
- if (abs(x[0] - x_prev[0]) > abs(x[1] - x_prev[1]))
- return abs(x[0] - x_prev[0]);
- else
- return abs(x[1] - x_prev[1]);
- }
- int main() {
- double acc = 0.001;
- //Метод простых итераций:
- cout << "Metod prostih iteracii:" << endl;
- x_prev[0] = 2.5;
- x_prev[1] = 0.5;
- x[0] = sqrt(6 * log(6 - x_prev[0]) / x_prev[0] + 1);
- x[1] = (x_prev[0] * x_prev[0] - 1) / 6;
- while (maxdiff() > acc) {
- cout << "x1=" << x[0] << '\t' << "x1_prev=" << x_prev[0] << endl << endl;
- cout << "x2=" << x[1] << '\t' << "x2_prev=" << x_prev[1] << endl << endl;
- cout << "f1=" << f1(x[0], x[1]) << '\t' << "f2=" << f2(x[0], x[1]) << endl;
- x_prev[0] = x[0];
- x_prev[1] = x[1];
- x[0] = sqrt(6 * log(6 - x_prev[0]) / x_prev[0] + 1);
- x[1] = (x_prev[0] * x_prev[0] - 1) / 6;
- cout << "--------------------------" << endl << endl;
- }
- cout << "x1=" << x[0] << '\t' << "x1_prev=" << x_prev[0] << endl << endl;
- cout << "x2=" << x[1] << '\t' << "x2_prev=" << x_prev[1] << endl << endl;
- cout << round(f1(x[0], x[1])) << '\t' << round(f2(x[0], x[1])) << endl << endl;
- cout << "||||||||||||||||||||||||||" << endl << endl;
- cout << endl << endl << endl;
- //Метод Ньютона:
- cout << "Metod Newtona:" << endl;
- x_prev[0] = 3;
- x_prev[1] = 1;
- slaufill();
- slausolve_nextstep();
- while (maxdiff() > acc) {
- cout << "x1=" << x[0] << '\t' << "x1_prev=" << x_prev[0] << endl << endl;
- cout << "x2=" << x[1] << '\t' << "x2_prev=" << x_prev[1] << endl << endl;
- cout << "f1=" << f1(x[0], x[1]) << '\t' << "f2=" << f2(x[0], x[1]) << endl;
- x_prev[0] = x[0];
- x_prev[1] = x[1];
- slaufill();
- slausolve_nextstep();
- cout << "--------------------------" << endl << endl;
- }
- cout << "x1=" << x[0] << '\t' << "x1_prev=" << x_prev[0] << endl << endl;
- cout << "x2=" << x[1] << '\t' << "x2_prev=" << x_prev[1] << endl << endl;
- cout << round(f1(x[0], x[1])) << '\t' << round(f2(x[0], x[1])) << endl << endl;
- cout << "||||||||||||||||||||||||||" << endl << endl;
- char j;
- cin >> j;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement