Решите систему двух уравнений с двумя неизвестными

Решите систему двух уравнений с двумя неизвестными ниже:

введите описание изображения здесь

a1, b1, c1, a2, b2 и c2 вводятся самим пользователем.

Сначала я пытался найти математическое решение проблемы и, похоже, далеко уйти не могу ..

Что я пробовал до сих пор:

  1. Из первого уравнения найти y. (b1y = c1-a1x, y = (c1-a1x) / b1)
  2. Затем я заменяю y во втором уравнении и получаю одно уравнение с 1 неизвестным в данном случае x. Однако я не могу решить уравнение, я получаю некоторые нечетные числа / уравнения и останавливаюсь на этом.

Это правильно или есть более простой способ сделать это?

Текущий код:

#include <iostream>

using namespace std;

int main()
{
    int a1, b1, c1, a2, b2, c2;
    cout << "Enter the values for the first equation." << endl;
    cout << "Enter the value for a1" << endl;
    cin >> a1;
    cout << "Enter the value for b1" << endl;
    cin >> b1;
    cout << "Enter the value for c1" << endl;
    cin >> c1;
    cout << "Enter the values for the second equation." << endl;
    cout << "Enter the value for a2" << endl;
    cin >> a2;
    cout << "Enter the value for b2" << endl;
    cin >> b2;
    cout << "Enter the value for c2" << endl;
    cin >> c2;
    cout << "Your system of equations is the following:" << endl;
    cout << a1 << "x+" << b1 << "y=" << c1 << endl;
    cout << a2 << "x+" << b2 << "y=" << c2 << endl;

if ((a1 * b2) - (b1 * a2) == 0){
    cout << "The system has no solution." << endl;
}
else{
    res_x = ((c1*b2) - (b1*c2))/((a1*b2)-(b1*a2));
    res_y = ((a1*c2) - (c1*a2)) / ((a1*b2) - (b1*a2));
    cout << "x=" << res_x << " y=" << res_y << endl;
}

    return 0;
}

person user2925251    schedule 27.10.2013    source источник
comment
в вашем коде сначала вы должны проверить, есть ли у вашей системы из двух неизвестных одно, бесконечное или нулевое решение (вычислить определитель)   -  person lolando    schedule 27.10.2013
comment
Решение напрямую задается как обратная матрице 2x2 (a1, b1; a2, b2) тогда и только тогда, когда матрица обратима (т. Е. Det! = 0).   -  person Alexander Gessler    schedule 27.10.2013
comment
Возможно, вы захотите проверить какую-нибудь библиотеку для решения уравнений (например, что-то вроде eigen) .   -  person πάντα ῥεῖ    schedule 27.10.2013
comment
Правило Крамера   -  person timrau    schedule 27.10.2013
comment
Или, если вы хотите знать, как добраться до решения, не зная, что сказал @AlexanderGessler, вы можете сделать это: умножьте первое отношение на b2, второе отношение на b1, а затем вычтите два отношения. Вы получите что-то вроде x * (a1b2-a2b1) = c1b2 - c2b1. Теперь вам просто нужно проверить, что a1b2 - a2b1 не равно 0, и если это не так, разделите последнее отношение с ним, и вы получите x. Если это 0, у вас нет решения.   -  person DrM    schedule 27.10.2013
comment
@DrM Если это 0, у вас нет уникального решения (либо нет, либо бесконечное решение)   -  person lolando    schedule 27.10.2013
comment
Решено с помощью правила Крамера .. спасибо!   -  person user2925251    schedule 27.10.2013
comment
Не собственное. Даже библиотеки. Это закрытая форма решения, которую легко написать полностью.   -  person duffymo    schedule 12.09.2019


Ответы (2)


мы решаем линейную систему, используя правило Крамера:

int main(int argc, char** argv) {
    /* we solve the linear system
     * ax+by=e
     * cx+dy=f
     */
    if(argc != 7) {
        cerr<<"Cramer equations system: error,"
                             " we need a,b,c,d,e,f parameters.\n";
        return -1;
    }

    double a,b,e;
    double c,d,f;
    sscanf(argv[1],"%lf",&a);
    sscanf(argv[2],"%lf",&b);
    sscanf(argv[3],"%lf",&e);
    sscanf(argv[4],"%lf",&c);
    sscanf(argv[5],"%lf",&d);
    sscanf(argv[6],"%lf",&f);

    double determinant = a*d - b*c;
    if(determinant != 0) {
        double x = (e*d - b*f)/determinant;
        double y = (a*f - e*c)/determinant;
        printf("Cramer equations system: result, x = %f, y = %f\n", x, y);
    } else {
        printf("Cramer equations system: determinant is zero\n"
                "there are either no solutions or many solutions exist.\n"); 
    }
    return 0;
}

./cramer_equation_system 1 2 5 1 -1 -1

Система уравнений Крамера: результат, x = 1.000000, y = 2.000000

person 4pie0    schedule 27.10.2013

Версия Javascript, вдохновленная ответом 4pie0

// throws error if intersection can't be found
function intersect_2_lines (
    a,b,e,
    c,d,f
)
{
        /* we solve the linear system
         * ax+by=e
         * cx+dy=f
         */

        var determinant = a*d - b*c;
        if(determinant != 0) {
            var x = (e*d - b*f)/determinant;
            var y = (a*f - e*c)/determinant;
            console.log(`Cramer equations system: result, x = ${x}, y = ${y}\n`);
        } else {
            throw new Error("Cramer equations system: determinant is zero\n" +
                    "there are either no solutions or many solutions exist.\n"); 
        }
        return [x,y];
}
person gregn3    schedule 12.09.2019