如何使用二维数组、逆矩阵和乘法求出给定线性方程的解?
How to use two dimensional arrays, Inverses, and multiplication to get solutions to a given linear equation?
给定这些等式:
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
为了解决这个问题,首先将系数放入一个二乘二的矩阵中:
[一乙]
[德]
并将常量值放入数组中:
[ c f ]
然后通过找到其行列式来反转系数矩阵:
det = ( ae - bd )
如果行列式为 0,此时终止并显示错误消息 "too complicated"
系数矩阵的逆矩阵是
[ e/det -b/det ]
[ -d/det a/det ]
这应该乘以常量数组以产生
[ (ec-fb)/det (af-cd)/det ]
示例:
ax+by=c
dx+ey=f
正确INPUT/OUTPUT
给出数字
1 2 3 4 5 6
x=-1.000000
y=2.000000
我的INPUT/OUTPUT
给出数字:
1 2 3 4 5 6
y = 1.6666667
x = 4.6666667
det = -3.0000
当您的代码读取输入时 {1 2 3 4 5}
它表示方程式
1 * x + 2 * y = 3
4 * x + 5 * y = 6
正确答案确实是x = -1
、y = 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
向量。
你错误地完成了 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);
}
给定这些等式:
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 为了解决这个问题,首先将系数放入一个二乘二的矩阵中: [一乙] [德] 并将常量值放入数组中: [ c f ] 然后通过找到其行列式来反转系数矩阵: det = ( ae - bd ) 如果行列式为 0,此时终止并显示错误消息 "too complicated"
系数矩阵的逆矩阵是 [ e/det -b/det ] [ -d/det a/det ] 这应该乘以常量数组以产生 [ (ec-fb)/det (af-cd)/det ]
示例:
ax+by=c dx+ey=f
正确INPUT/OUTPUT
给出数字
1 2 3 4 5 6
x=-1.000000
y=2.000000
我的INPUT/OUTPUT
给出数字:
1 2 3 4 5 6
y = 1.6666667 x = 4.6666667
det = -3.0000
当您的代码读取输入时 {1 2 3 4 5}
它表示方程式
1 * x + 2 * y = 3
4 * x + 5 * y = 6
正确答案确实是x = -1
、y = 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
向量。
你错误地完成了 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);
}