求一个多元一次方程的所有解?

xrd42077 2019-07-25 03:53:27
有什么方法能高效的求出一个多元一次方程的所有解?
例如 X1+X2+......+X26=51;

的所有整数解,要求每个解的范围在0-10之间。
...全文
2853 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
wid999 2019-08-05
  • 打赏
  • 举报
回复
先说明,这段程序是用枚举的方式求解,所以非常耗时!

    internal class Cacu
{
//a1X1+a2X2+......+anXn=M;
//a1到an为各元系数

/// <summary>
/// 方程的解的列表
/// </summary>
/// <param name="iRatios">各元系数an</param>
/// <param name="iM">总和</param>
/// <param name="iXLower">各元的下限</param>
/// <param name="iXUpper">各元的上限</param>
internal System.Collections.Generic.List<int[]> CacuIt(int[] iRatios, int iM, int iXLower, int iXUpper)
{
System.Collections.Generic.List<int[]> lAnswers = new List<int[]>();
if (iXLower * iRatios.Length <= iM)//有解
{
int[] iXs = new int[iRatios.Length];
for (int I = 0; I < iXs.Length; I++) iXs[I] = iXLower;
bool blNotEnd = true;
while (blNotEnd)
{
if (GetCacuState(iRatios, iXs, iM))
{
int[] iXt = new int[iRatios.Length];
for (int I = 0; I < iXt.Length; I++) iXt[I] = iXs[I];
lAnswers.Add(iXt);
}
int iIndex = 0;
bool blOverflow = true;
while (blOverflow && iIndex < iXs.Length)
{
int iT = iXs[iIndex] + 1;
if (iT > iXUpper)
{
iXs[iIndex] = iXLower;
iIndex++;
}
else
{
iXs[iIndex] = iT;
blOverflow = false;
}
}
blNotEnd = iIndex < iXs.Length;
}
}
return lAnswers;
}


/// <summary>
/// 算下是不是解
/// </summary>
/// <param name="iRatios">系数表</param>
/// <param name="iXs">当前解</param>
/// <param name="iM">和</param>
/// <returns>计算结果</returns>
internal bool GetCacuState(int[] iRatios, int[] iXs, int iM)
{
int iSum = 0;
for (int I = 0; I < iRatios.Length; I++)
iSum += iRatios[I] * iXs[I];

//if (iSum == iM)
//{
// for (int I = 0; I < iXs.Length; I++)
// Console.Write(string.Format("{0}\t", iXs[I]));
// Console.WriteLine();
//}

return iSum == iM;
}
}
阿佳呀 2019-08-03
  • 打赏
  • 举报
回复
引用 8 楼 xrd42077的回复:
[quote=引用 7 楼 java__net 的回复:] 这个题目没看懂,固定X1加到X26么?那不可能是整数,从1加到10就已经55了.
不是固定的可以是10+10+10+10+1+0.....+0=51。 可以是0。[/quote] 那你这个是n元n次方程了呀
阿佳呀 2019-08-03
  • 打赏
  • 举报
回复
引用 21 楼 lxl126的回复:
[quote=引用 17 楼 jx315425246 的回复:]
[quote=引用 15 楼 lxl126 的回复:]
[quote=引用 12 楼 jx315425246 的回复:]
求所有正整数解可以,只能用枚举,26个未知数每个未知数取值范围(0-51)嵌套26个循环,每个循环循环次数51次,总次数51的26次方,枚举结果小于这个数


借楼请问大佬:一元n次方程,(楼主的是n=26),如果事先不知道n的数值,n为变量。

意味着需要n个循环,那么怎么写代码呢[/quote]

那就用递归,n次递归
[/quote]



谢谢回复~~之前也想过也只有递归的办法了,可是这个用递归可能难以实现吧,感觉递归也就实现A!这种问题。


例如:
已知四元一次方程x1+2x2+3x3+5x4=6,列出所有可能的自然数解
https://ask.csdn.net/questions/766857
#!/usr/bin/python
for x1 in range(0, 7):
for x2 in range(0, 7):
for x3 in range(0, 7):
for x4 in range(0, 7):
if x1 + 2 * x2 + 3 * x3 + 5 * x4 == 6:
print(str(x1) + " " + str(x2) + " " + str(x3) + " " + str(x4) + " " + str(2**x1+3**x2+4**x3+5**x4));


这个用递归就很难写吧,恳求大神指点[/quote] def equation(x): if x==0: print(pow(x,1),'+2*',pow(x,2),'+3*',pow(x,3),'+5*',pow(x,4),'!=6') return elif (pow(x,1)+2*pow(x,2)+3*pow(x,3)+5*pow(x,4))==6: print(pow(x,1),'+2*',pow(x,2),'+3*',pow(x,3),'+5*',pow(x,4),'=6') else: print(pow(x,1),'+2*',pow(x,2),'+3*',pow(x,3),'+5*',pow(x,4),'!=6') equation((x-1)) i=6 equation(int(i)) """ 输出结果: 6 +2* 36 +3* 216 +5* 1296 !=6 5 +2* 25 +3* 125 +5* 625 !=6 4 +2* 16 +3* 64 +5* 256 !=6 3 +2* 9 +3* 27 +5* 81 !=6 2 +2* 4 +3* 8 +5* 16 !=6 1 +2* 1 +3* 1 +5* 1 !=6 0 +2* 0 +3* 0 +5* 0 !=6 """
阿佳呀 2019-08-03
  • 打赏
  • 举报
回复
引用 20 楼 lxl126的回复:
谢谢回复~~之前也想过也只有递归的办法了,可是这个用递归可能难以实现吧,感觉递归也就实现A!这种问题。


例如:
已知四元一次方程x1+2x2+3x3+5x4=6,列出所有可能的自然数解
https://ask.csdn.net/questions/766857
#!/usr/bin/python
for x1 in range(0, 7):
for x2 in range(0, 7):
for x3 in range(0, 7):
for x4 in range(0, 7):
if x1 + 2 * x2 + 3 * x3 + 5 * x4 == 6:
print(str(x1) + " " + str(x2) + " " + str(x3) + " " + str(x4) + " " + str(2**x1+3**x2+4**x3+5**x4));


这个用递归就很难写吧,恳求大神指点
你确定你的方程有解吗?我写出来测试没解,而且x前面的系数1 2 3 5没有规律,我也是小白,有大佬写出来的话可以顺便复制粘贴回复我一下
UnnamedOrange 2019-08-02
  • 打赏
  • 举报
回复
要求出所有解的话直接搜索。 如果只用求出解的个数的话使用动态规划。
  • 打赏
  • 举报
回复
循环呗,这还不简单,倒是你这题目无解啊
luj_1768 2019-07-31
  • 打赏
  • 举报
回复
大家讨论的很好,再进一步就解决了:10+10+10+10+10+1; 这个算式很重要,之后讨论的是10+10+10+10+9+2; 然后是10+10+10+10+9+1+1; 10+10+10+10+8+3; 10+10+10+10+8+2+1; ...
2019-07-30
  • 打赏
  • 举报
回复
引用 楼主 xrd42077的回复:
有什么方法能高效的求出一个多元一次方程的所有解?
例如 X1+X2+......+X26=51;

的所有整数解,要求每个解的范围在0-10之间。
1⇒10这个要点逻辑
jx315425246 2019-07-29
  • 打赏
  • 举报
回复
引用 23 楼 楠木_ 的回复:
[quote=引用 1 楼 wanghui0380的回复:]51个1,分成26堆。

正解,然后用闸板法,两个板距离不超过10[/quote]
怎么解?,你写一个出来
lxl126 2019-07-28
  • 打赏
  • 举报
回复
引用 11 楼 wid999 的回复:
X1+X2+......+Xn=M
Xn的取值[0,M]的整数,

定义数组X[n-1]存临时X的值,

定义一个迭代函数,参数包括:
n——几元,
M——还剩下可以用来分的整数。
函数提前返回的条件:
M=0,此时余下的X都是0,
或n=1,此时Xn=M。

M=51,n=26应该不用多久就可以全迭代出来。



借楼请问大佬:一元n次方程,(楼主的是n=26),如果事先不知道n的数值,n为变量。

意味着需要n个循环,那么怎么写代码呢
lxl126 2019-07-28
  • 打赏
  • 举报
回复
引用 12 楼 jx315425246 的回复:
求所有正整数解可以,只能用枚举,26个未知数每个未知数取值范围(0-51)嵌套26个循环,每个循环循环次数51次,总次数51的26次方,枚举结果小于这个数


借楼请问大佬:一元n次方程,(楼主的是n=26),如果事先不知道n的数值,n为变量。

意味着需要n个循环,那么怎么写代码呢
lxl126 2019-07-28
  • 打赏
  • 举报
回复
借楼提问:一元n次方程,(楼主的是n=26),如果事先不知道n的数值,n为变量。那么怎么写这个循环呢
楠木_ 2019-07-28
  • 打赏
  • 举报
回复
引用 1 楼 wanghui0380的回复:
51个1,分成26堆。
正解,然后用闸板法,两个板距离不超过10
Crazy_咸鱼 2019-07-28
  • 打赏
  • 举报
回复
引用 7 楼 java__net的回复:
这个题目没看懂,固定X1加到X26么?那不可能是整数,从1加到10就已经55了.
范围是0~1,0可以的
jx315425246 2019-07-28
  • 打赏
  • 举报
回复

List<string> sl = new List<string>();
/// <summary>
/// 多元一次方程
/// </summary>
/// <param name="n">元数(多少个未知数)</param>
/// <param name="y">方程式的值</param>
/// <param name="cn">当前第几元(未知数)取值</param>
/// <param name="cy">当前取值后的值</param>
/// <param name="slist">取值数列</param>
/// <returns></returns>
public void GetY(int n,int y,int cn,int cy,string slist)
{
string s;
int i, j, k;
s = slist;
for(i=0;i<y;i++)
{
k = cy + i;
s = s + i.ToString() + " ";
if(k<y && cn<n)
{
GetY(n, y, cn + 1, k, s);
}
if(cn==n && k==y)
{
sl.Add(s);
}
}
}
lxl126 2019-07-28
  • 打赏
  • 举报
回复
引用 17 楼 jx315425246 的回复:
[quote=引用 15 楼 lxl126 的回复:]
[quote=引用 12 楼 jx315425246 的回复:]
求所有正整数解可以,只能用枚举,26个未知数每个未知数取值范围(0-51)嵌套26个循环,每个循环循环次数51次,总次数51的26次方,枚举结果小于这个数


借楼请问大佬:一元n次方程,(楼主的是n=26),如果事先不知道n的数值,n为变量。

意味着需要n个循环,那么怎么写代码呢[/quote]

那就用递归,n次递归
[/quote]



谢谢回复~~之前也想过也只有递归的办法了,可是这个用递归可能难以实现吧,感觉递归也就实现A!这种问题。


例如:
已知四元一次方程x1+2x2+3x3+5x4=6,列出所有可能的自然数解
https://ask.csdn.net/questions/766857
#!/usr/bin/python
for x1 in range(0, 7):
for x2 in range(0, 7):
for x3 in range(0, 7):
for x4 in range(0, 7):
if x1 + 2 * x2 + 3 * x3 + 5 * x4 == 6:
print(str(x1) + " " + str(x2) + " " + str(x3) + " " + str(x4) + " " + str(2**x1+3**x2+4**x3+5**x4));


这个用递归就很难写吧,恳求大神指点
lxl126 2019-07-28
  • 打赏
  • 举报
回复
谢谢回复~~之前也想过也只有递归的办法了,可是这个用递归可能难以实现吧,感觉递归也就实现A!这种问题。


例如:
已知四元一次方程x1+2x2+3x3+5x4=6,列出所有可能的自然数解
https://ask.csdn.net/questions/766857
#!/usr/bin/python
for x1 in range(0, 7):
for x2 in range(0, 7):
for x3 in range(0, 7):
for x4 in range(0, 7):
if x1 + 2 * x2 + 3 * x3 + 5 * x4 == 6:
print(str(x1) + " " + str(x2) + " " + str(x3) + " " + str(x4) + " " + str(2**x1+3**x2+4**x3+5**x4));


这个用递归就很难写吧,恳求大神指点
XBodhi. 2019-07-28
  • 打赏
  • 举报
回复
如果是整数的话等于是把所有的 值穷举一下。

例如 56 个 1

然后每个值 0-10 然后多余的位数补0 .
jx315425246 2019-07-28
  • 打赏
  • 举报
回复
引用 15 楼 lxl126 的回复:
[quote=引用 12 楼 jx315425246 的回复:]
求所有正整数解可以,只能用枚举,26个未知数每个未知数取值范围(0-51)嵌套26个循环,每个循环循环次数51次,总次数51的26次方,枚举结果小于这个数


借楼请问大佬:一元n次方程,(楼主的是n=26),如果事先不知道n的数值,n为变量。

意味着需要n个循环,那么怎么写代码呢[/quote]

那就用递归,n次递归
jx315425246 2019-07-27
  • 打赏
  • 举报
回复
求所有正整数解可以,只能用枚举,26个未知数每个未知数取值范围(0-51)嵌套26个循环,每个循环循环次数51次,总次数51的26次方,枚举结果小于这个数
加载更多回复(10)
本资源涵盖多元方程组、非线性方程和常微分方程的软件组合,介绍如下: 线性方程组的数值法: 线性方程组亦即多元一次方程组。在自然科学与工程技术中,很多问题的决常常归结为线性方程组,如电学中的网络问题,船体数学放样中的建立三次样条函数问题,机械和建筑结构的设计和计算等等。因此,如何利用电子计算机这一强有力的计算工具去线性方程组,是一个非常重要的问题。线性方程组的法分直接()法{是指在没有舍入误差的假设下,经过有限步运算即可得方程组的精确的方法。}和迭代()法{是用某种极限过程去逐步逼近线性方程组精确的方法,即是从一个初始向量x0出发,按照一定的迭代格式产生一个向量序列xk,使其收敛到方程组A*x=b的}。该部分就是针对线性方程组而设计的,内容包括:线性方程组的直接法:Gauss消去法、Gauss列主元消去法、Gauss全主元消去法、列主元消去法应用『列主元逆矩阵、列主元行列式、矩阵的三角分』、LU分法、平方根法、改进的平方根法、追赶法(三对角)、列主元三角分法;线性方程组的迭代法:雅可比迭代法、高斯-塞德尔迭代法、逐次超松驰迭代法;迭代法的收敛性『正定矩阵判断、向量范数、矩阵范数、严格对角站优矩阵判断』。 非线性方程的数值法: 在科学研究与工程技术中常会遇到非线性方程f(x)=0的问题。而方程f(x)是多项式或超越函数又分为代数方程或超越方程。对于不高于四次的代数方程已有根公式,而高于四次的代数方程则无精确的根公式,至于超越方程就更无法其精确了。因此,如何得满足一定精度要的方程的近似根也就成为了广大科技工作者迫切需要决的问题。该部分就是针对这一问题而设计的,内容包括:二分法、迭代法、迭代加速法、埃特金加速法、牛顿切线法、弦截法。 常微分方程的数值法: 常微分方程的问题在实践中经常遇到,但我们只知道一些特殊类型的常微分方程的。在科学和工程问题中遇到的常微分方程的往往很复杂,在许多问题中,并不需要方程的表达式,而仅仅需要获得在若干点的就算即可。因此,研究常微分方程的的数值就很有必要。该部分就是针对这些而设计的,内容包括:欧拉(Euler)方法、龙格库塔(Runge-Kutta)方法、线性多步方法

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧