解个非齐次线性方程组

某天作业要做一个类似解方程组的操作,刚好在那个时候又在看永乐大帝的线性代数。想着看看能不能用代码实现以下,当然只是很简陋的操作了一下数组而已,结果如下:

题目:

西瓜5块钱一个,哈密瓜3块钱一只,李子3个一块钱,用100块钱买水果,

其中西瓜、哈密瓜和李子都必须要有且总共100个,问西瓜、哈密瓜和李子要买多少个刚好凑足100块钱。

代码:

#非齐次线性方程组:  X+Y+Z=100   5X+3Y+1/3Z=100
import fractions
a=[[1,1,1,100],[5,3,1/3,100]]
res=[0 for i in range(len(a[0]))]

#非齐次线性
#化为阶梯型矩阵
def changeM(x,y):
    if(x>len(a) and y>len(a[0])):
        return
    else:
        #判断对角的值是否为1
        if(a[x][y]==1):
            k=-a[x+1][y]/a[x][y]
            for i in range(len(a[x])):
                res[i] = k*a[x][i]
            for j in range(len(a[x+1])):
                a[x+1][j] = res[j] + a[x+1][j]
            x=x+1
            y=y+1
            changeM(x, y)
        elif(a[x][y] == 0):
            return
        else:
            #整行乘对角值的倒数
            k = 1/a[x][y]
            for i in range(len(a[x])):
                a[x][i] = a[x][i] * k
                #加到上一行(因为这道题是二维的,所以就不探讨下一行的了)
                a[x-1][i] = a[x-1][i] -a[x][i]
                #print(a[x-1][i])

def solveThisPromble(A):
    j=1
    for i in range(100):
        X = A[0][3]-A[0][2]*i
        Y = A[1][3]-A[1][2]*i
        #能被3整除的数
        if(i%3==0 and 0<i<100):
            if(1<X<100 and 1<Y<100):
                print(""+str(j)+"组解:")
                print(i)
                print(int(X))
                print(int(Y))
                j=j+1



changeM(0,0)
solveThisPromble(a)

猜你喜欢

转载自www.cnblogs.com/jev-0987/p/13207604.html
今日推荐