误使用 horzcat 要串联的数组的维度不一致。 出错 simplex (第 39 行) T = [A, b; c, 0]; 出错 test1 (第 4 行) [x, fval, exitflag] = simplex(A, b, c);
时间: 2023-12-17 21:05:34 浏览: 102
这个错误通常是因为你尝试将维度不同的数组连接起来。在这种情况下,您需要检查您的代码,以确定哪个数组的维度不匹配。您可以使用 `size` 函数查看数组的维度,并使用 `transpose` 函数更改数组的方向。
在您的代码中,`horzcat` 函数试图将 `A` 和 `b` 数组连接起来,但它们的维度不同。您可以使用 `transpose` 函数将 `b` 数组转换为一列,然后再将其连接到 `A` 数组中。例如:
```
T = [A, transpose(b); c, 0];
```
这应该可以解决这个错误。
相关问题
f+g+a>=15 g+a+b>=18 a+b+c>=25 b+c+d>=19 c+d+e>=31 d+e+f>=45 e+f+g>=47 minz=a+b+c+d+e+f+g的C语言代码
下面是一个实现上述线性规划问题的C语言代码,使用GLPK库求解:
```c
#include <stdio.h>
#include <glpk.h>
int main()
{
glp_prob *lp;
int ia[1+1000], ja[1+1000];
double ar[1+1000], z;
int ret;
// 创建一个线性规划问题
lp = glp_create_prob();
glp_set_prob_name(lp, "example");
// 添加变量
glp_add_cols(lp, 7);
glp_set_col_name(lp, 1, "f");
glp_set_col_kind(lp, 1, GLP_CV);
glp_set_col_bnds(lp, 1, GLP_LO, 0.0, 0.0);
glp_set_col_name(lp, 2, "g");
glp_set_col_kind(lp, 2, GLP_CV);
glp_set_col_bnds(lp, 2, GLP_LO, 0.0, 0.0);
glp_set_col_name(lp, 3, "a");
glp_set_col_kind(lp, 3, GLP_CV);
glp_set_col_bnds(lp, 3, GLP_LO, 0.0, 0.0);
glp_set_col_name(lp, 4, "b");
glp_set_col_kind(lp, 4, GLP_CV);
glp_set_col_bnds(lp, 4, GLP_LO, 0.0, 0.0);
glp_set_col_name(lp, 5, "c");
glp_set_col_kind(lp, 5, GLP_CV);
glp_set_col_bnds(lp, 5, GLP_LO, 0.0, 0.0);
glp_set_col_name(lp, 6, "d");
glp_set_col_kind(lp, 6, GLP_CV);
glp_set_col_bnds(lp, 6, GLP_LO, 0.0, 0.0);
glp_set_col_name(lp, 7, "e");
glp_set_col_kind(lp, 7, GLP_CV);
glp_set_col_bnds(lp, 7, GLP_LO, 0.0, 0.0);
// 添加约束
glp_add_rows(lp, 6);
glp_set_row_name(lp, 1, "c1");
ia[1] = 1, ja[1] = 1, ar[1] = 1.0;
ia[2] = 1, ja[2] = 2, ar[2] = 1.0;
ia[3] = 1, ja[3] = 3, ar[3] = 1.0;
glp_set_mat_row(lp, 1, 3, ia, ja, ar);
glp_set_row_bnds(lp, 1, GLP_LO, 15.0, 0.0);
glp_set_row_name(lp, 2, "c2");
ia[1] = 1, ja[1] = 2, ar[1] = 1.0;
ia[2] = 1, ja[2] = 3, ar[2] = 1.0;
ia[3] = 1, ja[3] = 4, ar[3] = 1.0;
glp_set_mat_row(lp, 2, 3, ia, ja, ar);
glp_set_row_bnds(lp, 2, GLP_LO, 18.0, 0.0);
glp_set_row_name(lp, 3, "c3");
ia[1] = 1, ja[1] = 3, ar[1] = 1.0;
ia[2] = 1, ja[2] = 4, ar[2] = 1.0;
ia[3] = 1, ja[3] = 5, ar[3] = 1.0;
glp_set_mat_row(lp, 3, 3, ia, ja, ar);
glp_set_row_bnds(lp, 3, GLP_LO, 25.0, 0.0);
glp_set_row_name(lp, 4, "c4");
ia[1] = 1, ja[1] = 4, ar[1] = 1.0;
ia[2] = 1, ja[2] = 5, ar[2] = 1.0;
ia[3] = 1, ja[3] = 6, ar[3] = 1.0;
glp_set_mat_row(lp, 4, 3, ia, ja, ar);
glp_set_row_bnds(lp, 4, GLP_LO, 19.0, 0.0);
glp_set_row_name(lp, 5, "c5");
ia[1] = 1, ja[1] = 5, ar[1] = 1.0;
ia[2] = 1, ja[2] = 6, ar[2] = 1.0;
ia[3] = 1, ja[3] = 1, ar[3] = 1.0;
glp_set_mat_row(lp, 5, 3, ia, ja, ar);
glp_set_row_bnds(lp, 5, GLP_LO, 31.0, 0.0);
glp_set_row_name(lp, 6, "c6");
ia[1] = 1, ja[1] = 6, ar[1] = 1.0;
ia[2] = 1, ja[2] = 7, ar[2] = 1.0;
ia[3] = 1, ja[3] = 1, ar[3] = 1.0;
glp_set_mat_row(lp, 6, 3, ia, ja, ar);
glp_set_row_bnds(lp, 6, GLP_LO, 45.0, 0.0);
// 设置目标函数
ia[1] = 1, ja[1] = 3, ar[1] = 1.0;
ia[2] = 1, ja[2] = 4, ar[2] = 1.0;
ia[3] = 1, ja[3] = 5, ar[3] = 1.0;
ia[4] = 1, ja[4] = 6, ar[4] = 1.0;
ia[5] = 1, ja[5] = 7, ar[5] = 1.0;
glp_set_obj_coef(lp, 3, 1.0);
glp_set_obj_coef(lp, 4, 1.0);
glp_set_obj_coef(lp, 5, 1.0);
glp_set_obj_coef(lp, 6, 1.0);
glp_set_obj_coef(lp, 7, 1.0);
glp_set_obj_dir(lp, GLP_MIN);
// 求解线性规划问题
glp_simplex(lp, NULL);
ret = glp_get_status(lp);
// 获取结果
if (ret == GLP_OPT)
{
z = glp_get_obj_val(lp);
printf("optimal solution z = %g\n", z);
}
else
{
printf("no optimal solution\n");
}
// 释放内存
glp_delete_prob(lp);
return 0;
}
```
在这个例子中,我们首先创建一个线性规划问题,然后添加变量和约束,设置目标函数,调用glp_simplex函数求解线性规划问题,并获取结果。最后,我们释放内存并结束程序。
需要注意的是,这个线性规划问题是一个混合整数规划问题,但我们没有对变量进行整数约束。如果需要对变量进行整数约束,可以使用GLPK的整数规划求解器。
f+g+a>=15 g+a+b>=18 a+b+c>=25 b+c+d>=19 c+d+e>=31 d+e+f>=45 e+f+g>=47 minz=a+b+c+d+e+f+g求解线性规划问题,不用任何库的C语言代码
要求解线性规划问题,可以使用单纯形法(simplex method)来解决。以下是使用单纯形法求解的 C 语言代码:
```c
#include <stdio.h>
#define M 6 // 约束数量
#define N 7 // 变量数量(包括 z)
// 求解线性规划问题
int simplex(double a[][N], int m, int n) {
int i, j, k;
double p, q;
while (1) {
// 查找最小的负系数
j = 1;
for (i = 2; i <= n; i++) {
if (a[0][i] < a[0][j]) {
j = i;
}
}
if (a[0][j] >= 0) {
break; // 所有系数都非负,结束循环
}
// 查找最小比率
k = -1;
for (i = 1; i <= m; i++) {
if (a[i][j] > 0) {
if (k == -1) {
k = i;
} else if (a[i][0] / a[i][j] < a[k][0] / a[k][j]) {
k = i;
}
}
}
if (k == -1) {
return -1; // 最优值为无穷大,结束循环
}
// 进行高斯消元
p = a[k][j];
for (i = 0; i <= n; i++) {
a[k][i] /= p;
}
for (i = 0; i <= m; i++) {
if (i != k) {
q = a[i][j];
for (j = 0; j <= n; j++) {
a[i][j] -= q * a[k][j];
}
}
}
}
return 0; // 求解成功
}
int main() {
double a[M + 1][N + 1] = {
{1, 0, 0, 0, 0, 0, 0, 0}, // 目标函数
{1, 1, 1, 0, 0, 0, 0, 15}, // 约束 1
{0, 1, 1, 1, 0, 0, 0, 18}, // 约束 2
{0, 0, 1, 1, 1, 0, 0, 25}, // 约束 3
{0, 0, 0, 1, 1, 1, 0, 19}, // 约束 4
{0, 0, 0, 0, 1, 1, 1, 31}, // 约束 5
{1, 0, 0, 0, 0, 1, 1, 47}, // 约束 6
};
int i, j, ret;
double minz;
ret = simplex(a, M, N);
if (ret == -1) {
printf("无解\n");
} else {
minz = -a[0][0];
printf("最小值为 %.2lf\n", minz);
printf("x = ");
for (j = 1; j <= N - 1; j++) {
for (i = 1; i <= M; i++) {
if (a[i][j] == 1) {
printf("%.2lf ", a[i][0]);
break;
}
}
if (i > M) {
printf("0 ");
}
}
printf("\n");
}
return 0;
}
```
这个代码中,我们先将线性规划问题转换为标准形式,然后使用单纯形法求解。在单纯形法中,我们首先查找目标函数中最小的负系数所对应的列,然后在该列中查找最小比率所对应的行。接着,我们进行高斯消元,将该行变为主元行,并在其他行中消去该列的系数。最后,我们重复这个过程,直到所有系数都非负为止,此时得到的目标函数值即为最小值。
阅读全文