使用python的sympy解符号方程组后,如何将结果带入之后的符号表达式 200
比如说符号方程组的结果是这样的result={x:a+b,y:b+c},是一个字典,然后我的符号表达式是存放在一个list里的,比如说list1=[‘x*y’],是字符串...
比如说符号方程组的结果是这样的result={x:a+b,y:b+c},是一个字典,然后我的符号表达式是存放在一个list里的,比如说list1=[‘x*y’],是字符串
那么如何得到 list1[1]=(a+b)*(b+c)的结果呢?
用sub()这样写:print(list1[1].sub(result)),会报错: 'str' object has no attribute ‘sub’
求大神指点错误,或者用另外的方法解决这个问题!! 展开
那么如何得到 list1[1]=(a+b)*(b+c)的结果呢?
用sub()这样写:print(list1[1].sub(result)),会报错: 'str' object has no attribute ‘sub’
求大神指点错误,或者用另外的方法解决这个问题!! 展开
展开全部
Sympy是python中非常强大的符号运算库,可以以书写习惯表示数学表达式。下面介绍用Sympy求方程数值解的方法。
下面代码全部在
from sympy import *
init_printing(use_unicode=True) # 按书写习惯输出
下运行。
数学表达式的输入
首先声明符号:
x = symbols('x')
即计算机中的变量x代表数学表达式中的x。在后文输出中所有的x会显示为x。如果x=symbols('x0'),则输入的方程中所有x将在输出中以x0表示。
如果需要希腊字母
l, r = symbol('lambda rho')
l, r将分别以λ,ρ表示。可以在一个表达式中同时声明多个符号。
或者使用var()声明:
var('x')
与上面等效。
声明表达式:
f = (5/x)*(exp(x)-1)-exp(x)
此时若输出f可以看到书写习惯的表达式。由于表达式在markdown下显示不正常,在此不放置示例。注意f的类型是class 'sympy.core.add.Add'
求f(x)=0数值解
因为有的函数零点不止一个,因此在Sympy中解的输出为一个list。使用solve(表达式,自变量符号)可以解析地解方程:
s, = solve(f, x)
这里根据上面f的赋值,得到s为
LambertW(-5e**-5)+5
其中用了特殊函数表达。
我们需要求这个结果的数值近似,则输出
s.evalf()
得到输出
4.96511423174428
就是方程f(x)=0的数值解。
求给定自变量x值时函数f(x)的值 | 将表达式转化为函数
f.evalf(subs = {x:4.96})
得到f(4.96)的数值
0.141885450782171
如果需要以计算机函数的形式定义函数f(x),则可以使用lambdify()进行转化:
f_func = lambdify(x, f)
之后可以调用
f_func(4.96)
输出
0.141885450782
利用这个方法可以测试方程的数值算法,如使用sympy接口写牛顿法等。
下面代码全部在
from sympy import *
init_printing(use_unicode=True) # 按书写习惯输出
下运行。
数学表达式的输入
首先声明符号:
x = symbols('x')
即计算机中的变量x代表数学表达式中的x。在后文输出中所有的x会显示为x。如果x=symbols('x0'),则输入的方程中所有x将在输出中以x0表示。
如果需要希腊字母
l, r = symbol('lambda rho')
l, r将分别以λ,ρ表示。可以在一个表达式中同时声明多个符号。
或者使用var()声明:
var('x')
与上面等效。
声明表达式:
f = (5/x)*(exp(x)-1)-exp(x)
此时若输出f可以看到书写习惯的表达式。由于表达式在markdown下显示不正常,在此不放置示例。注意f的类型是class 'sympy.core.add.Add'
求f(x)=0数值解
因为有的函数零点不止一个,因此在Sympy中解的输出为一个list。使用solve(表达式,自变量符号)可以解析地解方程:
s, = solve(f, x)
这里根据上面f的赋值,得到s为
LambertW(-5e**-5)+5
其中用了特殊函数表达。
我们需要求这个结果的数值近似,则输出
s.evalf()
得到输出
4.96511423174428
就是方程f(x)=0的数值解。
求给定自变量x值时函数f(x)的值 | 将表达式转化为函数
f.evalf(subs = {x:4.96})
得到f(4.96)的数值
0.141885450782171
如果需要以计算机函数的形式定义函数f(x),则可以使用lambdify()进行转化:
f_func = lambdify(x, f)
之后可以调用
f_func(4.96)
输出
0.141885450782
利用这个方法可以测试方程的数值算法,如使用sympy接口写牛顿法等。
展开全部
先指出一个错误:你list1中只有一个元素,应该用list1[0]取出;
这个问题,我也一直在找解决办法,苦搜无果,自己想到了增加方程组变量的方法来解决:新增变量-表达式=0,把这个方程同之前你得到的结果组成三元一次方程组,得出新增变量的解即可。
z=Symbol('z')
result1=solve([z-list1[0],x-result[x],y-result[y]],[x,y,z])
result1[z]就是你要的结果,拿走不谢~~
如果一元方程的解(x)带回表达式,思路一样,只是注意一元方程的解是存放在列表里(假设为result[]),而不是字典,列表中的第一个元素为实数解,所以代码变为:
y=Symbol('y')
result1=solve([y-list1[0],x-result[0],[x,y])
result1[y]即是。
这个问题,我也一直在找解决办法,苦搜无果,自己想到了增加方程组变量的方法来解决:新增变量-表达式=0,把这个方程同之前你得到的结果组成三元一次方程组,得出新增变量的解即可。
z=Symbol('z')
result1=solve([z-list1[0],x-result[x],y-result[y]],[x,y,z])
result1[z]就是你要的结果,拿走不谢~~
如果一元方程的解(x)带回表达式,思路一样,只是注意一元方程的解是存放在列表里(假设为result[]),而不是字典,列表中的第一个元素为实数解,所以代码变为:
y=Symbol('y')
result1=solve([y-list1[0],x-result[0],[x,y])
result1[y]即是。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询