我是靠谱客的博主 满意眼神,最近开发中收集的这篇文章主要介绍python 求解一元二次方程组,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

最近在做笔试题的时候遇到的一道题,挺有意思的贴出来和大佬讨论一下(常规的做法,不保证全对)

  • 题目要求:
  • 给两个方程,字符串格式给出,保证系数为整数。如6x-7+3y=2-5x和
    -5+x+y=8-x,保证有解且为整数。
  • 输入:两个方程;输出x,y的解,列表形式给出。如[1,2]表示x=1,y=2。
  • 整体思路:
    • 字符串提取x,y,常数项( c )的系数,使用哈希表实现
    • 考虑到给定的方程需要化简,因此第一步要化简等号左右两端的方程,并获取系数,并存放在字典中,移到等式一端,之后合并字典则6x-7+3y=2-5x化简结果为{x:11, y:3, c:-9}
    • 拿得到的系数使用消元法求解最终解

代码如下:该实现共包含三个函数:
transDict:用于获取参数,把给定的6x-7+3y=2-5x等号两端化简成两个字典
simplify:化简方程,调用transDict,化简整个参数为一个包含了整个方程系数的字典。
linearEquation:求解方程,消元法

import collections

class Solution:
    def transDict(self, equation):
        dictE = collections.defaultdict(int) # 默认字典类型,key:x,y,c对应的value为整形
        sign, value = 1, 0 #一个符号标志,一个值标志

        if equation[0] == '-': # 判断第一个是否是负号
            start = 1
            sign = -1
        else:
            start = 0

        size = len(equation)
        for i in range(start, size):
            if equation[i] in '-+': # 第二个负号,参数写入字典
                value *= sign
                sign = 1
                dictE['c'] += value # 常数项系数
                value = 0
                if equation[i] == '-':# 提取下一个符号
                    sign = -1

            elif equation[i] in 'xy': # 提取x,y系数
                if not value: # x,y前面没系数,设为1
                    value = 1
                value *= sign
                sign = 1

                if equation[i] == 'x': # 更新字典
                    dictE['x'] += value
                if equation[i] == 'y':
                    dictE['y'] += value
                value = 0

            elif equation[i].isdigit(): # 大于9的数加和
                value = value * 10 + int(equation[i])

                if i == size - 1:
                    value *= sign
                    dictE['c'] += value
        return dictE

    def simplify(self, equation):
        equation = equation.split('=')
        leftE, rightE = equation[0], equation[1]

        dictLeft = self.transDict(leftE) # 得到等式左边的字典
        dictRight = self.transDict(rightE) # 得到等式右边的字典

        for key, val in dictLeft.items(): # 合并
            dictLeft[key] -= dictRight[key]

        return dictLeft

    def linearEquation(self, equation1, equation2): # 消元法求解
        eDict1 = self.simplify(equation1)
        eDict2 = self.simplify(equation2)
        if eDict1['y'] != eDict2['y']:
            value = eDict2['y'] / eDict1['y']
            eDict1['y'] = eDict2['y']
            eDict1['x'] *= value
            eDict1['x'] -= eDict2['x']
            eDict1['c'] *= value
            eDict1['c'] -= eDict2['c']

        x = -eDict1['c'] / eDict1['x']
        y = (-eDict2['c'] - eDict2['x'] * x) // eDict2['y']
        return [int(x), int(y)]
    
''' 
这里也可以用[线性代数](https://baike.baidu.com/item/%E4%BA%8C%E5%85%83%E4%B8%80%E6%AC%A1%E6%96%B9%E7%A8%8B%E7%BB%84/7594389#2)知识求解
ax+by=e
cx+dy=f

x = (d*e-b*f)/(ad-bc)
y = (a*f-c*e)/(ad-bc)
'''

if __name__ == '__main__':
    s = Solution()
    while 1: # 循环测试
        equation1 = input()
        equation2 = input()
        print(s.linearEquation(equation1, equation2))
'''
x+3y=9
2x+y=13
6x-7+3y=2-5x
-5+x+y=8-x
'''

最后

以上就是满意眼神为你收集整理的python 求解一元二次方程组的全部内容,希望文章能够帮你解决python 求解一元二次方程组所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(71)

评论列表共有 0 条评论

立即
投稿
返回
顶部