【问题标题】:Create random systems of linear equations - Python创建线性方程组的随机系统 - Python
【发布时间】:2021-11-30 15:21:42
【问题描述】:

编辑:更多细节

您好,我通过我的一位老师发现了这个问题,但我仍然不明白如何解决它,我想知道是否有人对此有任何想法:

创建一个能够(随机)生成包含 2 到 8 个变量的方程组的程序。该程序将使用输入函数向用户询问方程组中的一些变量。系数的范围必须在 [-10,10] 之间,但任何系数都不能为 0。系数和解都必须是整数。

目标是打印系统并显示变量 (x,y,z,...) 的解。允许使用 NumPy。

据我了解,它应该这样工作:

Enter the number of variables: 2

x + y = 7 
4x - y =3

x = 2
y = 5

我还在学习python中的数组,但是它们的工作方式和matlab中的一样吗?

提前谢谢你:)!

【问题讨论】:

  • 未知变量是否有范围限制?可以说,如果你同时生成系数和未知变量,那么方程的 rhs 将是满足它们的任何东西,因此你不应该对它们有任何限制。
  • numpy 中的数组被设计为类似于 Matlab,但请记住 Python 中的数组从 0 开始编号,而不是 1。5x5 数组在两个轴上都有 0 到 4 的元素。
  • @Reti43 问我的老师。没有范围。只要它们是整数并且满足系统,一切都很好。
  • 程序必须解方程吗?还是可以简单地将解值随机化,然后组成方程?
  • @Stuart 从技术上讲,它并不能解决它们。它为未知变量和系数生成整数,这意味着可以根据这些计算每个方程的 rhs。

标签: python arrays variables random


【解决方案1】:

对于 k 变量,方程的 lhs 将是 k 未知数和系数 kxk 矩阵。这两者的点积应该给你rhs。然后这是一个简单的打印案例,随心所欲。

import numpy as np

def generate_linear_equations(k):
    coeffs = [*range(-10, 0), *range(1, 11)]
    rng = np.random.default_rng()
    return rng.choice(coeffs, size=(k, k)), rng.integers(-10, 11, k)

k = int(input('Enter the number of variables: '))
if not 2 <= k <= 8:
    raise ValueError('The number of variables must be between 2 and 8.')
coeffs, variables = generate_linear_equations(k)
solution = coeffs.dot(variables)

symbols = 'abcdefgh'[:k]
for row, sol in zip(coeffs, solution):
    lhs = ' '.join(f'{r:+}{s}' for r, s in zip(row, symbols)).lstrip('+')
    print(f'{lhs} = {sol}')
print()
for s, v in zip(symbols, variables):
    print(f'{s} = {v}')

举个例子

Enter the number of variables: 3
8a +6b -4c = -108
9a -9b -4c = 3
10a +10b +9c = -197

a = -9
b = -8
c = -3

如果您特别希望 lhs 的格式在符号之间有一个空格并且如果它的值为 1 则不显示系数,那么您需要更复杂的东西。将lhs 替换为以下内容:

def sign(n):
    return '+' if n > 0 else '-'

lhs = ' '.join(f'{sign(r)} {abs(r)}{s}' if r not in (-1, 1) else f'{sign(r)} {s}' for r, s in zip(row, symbols))
lhs = lhs[2:] if lhs.startswith('+') else f'-{lhs[2:]}'

【讨论】:

    【解决方案2】:

    我通过在您的约束范围内随机生成左侧和解,然后将解代入方程以生成右侧来做到这一点。随时要求澄清代码的任何部分。

    import numpy as np
    
    num_variables = int(input('Number of variables:'))
    valid_integers = np.asarray([x for x in range(-10,11) if x != 0])
    
    lhs = np.random.choice(valid_integers, lhs_shape)
    solution = np.random.randint(-10, 11, num_variables)
    rhs = lhs.dot(solution)
    
    for i in range(num_variables):
      for j in range(num_variables):
        symbol = '=' if j == num_variables-1 else '+'
        print(f'{lhs[i, j]:3d}*x{j+1} {symbol} ', end='')
      print(rhs[i])
    
    for i in range(num_variables):
      print(f'x{i+1} = {solution[i]}'
    

    示例输出:

    Number of variables:2
      2*x1 +  -7*x2 = -84
     -4*x1 +   1*x2 = 38
    x1 = -7
    x2 = 10
    

    【讨论】:

      猜你喜欢
      • 2017-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多