如何使用二维数组,反演和乘法来获得给定线性方程的解?

时间:2015-03-08 02:13:44

标签: c arrays math division

鉴于这些方程式:

ax + by = c

dx + ey = f

#include<stdio.h>
#include<stdlib.h>


int main (void){
//Data
float extra;
float x[2];
float y[2];
float solution[2];
float coef[2][2];

printf("Give Numbers:\n");
scanf("%f %f %f %f %f %f"
,&coef[0][0],  &coef[0][1], &solution[0],
&coef[1][0],  &coef[1][1], &solution[1]);


// Create Determinant
float det;
det = (coef[0][0] * coef[1][1] - coef[0][1] * coef[1][0]);


//Setting the Inverse
extra = coef[0][0];
coef[0][0] =   coef[1][1] / det;
coef[1][1] = extra / det;
coef[1][0] = -coef[1][0] / det;
coef[0][1] =  -coef[0][1] / det;





//Multiplication
y[0] = (coef[1][1]*solution[0]-solution[1]*coef[0][1]) / det;
x[1] = (coef[0][0]*solution[1]-solution[0]*coef[1][0]) / det;

//Print statements
printf("'Y' = %f\n" , y[0]);
printf("'X' = %f\n" , x[1]);
printf("Det= %f\n",det);

}

我正在编写一个程序来解决两个具有两个未知数的联立线性方程。

我有六个单精度浮点数a,b,c,d,e,f,每个由空格分隔。 这些数字意味着被解释为一对方程 通过= C +斧 DX + EY = F 要解决这个问题,首先将系数放入一个二乘二矩阵: [a b] [d e] 并将常量值放入数组中: [c f] 然后通过找到它的行列式来反转系数矩阵: det =(a e - b d) 如果行列式为0,则在此时终止,并显示错误消息&#34;太复杂&#34;

然后是系数矩阵的逆 [e / det -b / det] [-d / det a / det] 这应该乘以常数数组到yeild [(e c-f b)/ det(a f-c d)/ det]

实施例

AX通过= C + DX + EY = F

CORRECT INPUT / OUTPUT

给出数字

1 2 3 4 5 6

X = -1.000000

Y = 2.000000

MY INPUT / OUTPUT

给出数字:

1 2 3 4 5 6

y = 1.6666667 x = 4.6666667

det = -3.0000

2 个答案:

答案 0 :(得分:1)

当您的代码读取输入{1 2 3 4 5}时,它代表方程式

1 * x + 2 * y = 3
4 * x + 5 * y = 6

正确的答案确实是x = -1y = 2。由于乘法部分,您的程序无法计算正确答案,该部分应为:

x[0] = coef[0][0] * solution[0] + coef[0][1] * solution[1];
x[1] = coef[1][0] * solution[0] + coef[1][1] * solution[1]

原因是,一旦你得到倒数,唯一剩下的就是将它乘以solution向量。

答案 1 :(得分:0)

你已经错误地将RHS向量乘以逆矩阵。

如果代码x和y中的变量与您的等式匹配,则它们不应该是数组。您的变量名称令人困惑。我不认为RHS是解决方案;这就是x和y的含义。我叫它b。

您用反转替换了矩阵。您应该将RHS向量乘以倒数得到解。

试试这个:

#include<stdio.h>
#include<stdlib.h>


int main (void) {
    double a[2][2];
    double x[2];
    double b[2];

    printf("Give Numbers:\n");
    scanf("%f %f %f %f %f %f" &a[0][0],  &a[0][1], &b[0], &a[1][0],  &a[1][1], &b[1]);


    double det;
    det = a[0][0]*a[1][1] - a[0][1]*a[1][0];

    double extra;
    extra = a[0][0];
    a[0][0] = a[1][1]/det;
    a[1][1] = extra/det;
    a[1][0] = -a[1][0]/det;
    a[0][1] = -a[0][1]/det;

    x[0] = a[0][0]*b[0]+a[0][1]*b[1];
    x[1] = a[1][0]*b[0]+a[1][1]*b[1];

    printf("x[0]' = %f\n" , x[0]);
    printf("zx[1] = %f\n" , x[1]);
    printf("Det= %f\n",det);
}