本文目录一览:
- 1、python的解方程能力好像不是很强啊,为什么复杂一点的指数方程就求不出来了???
- 2、用python如何得到一个方程的多个解
- 3、用python来解决问题?
- 4、使用python算法如何解
- 5、计算化学,有python基础还有必要学习matlab么
python的解方程能力好像不是很强啊,为什么复杂一点的指数方程就求不出来了???
内置的算法不支持这么复杂的方程求解,需要编写特别的算法。
用python如何得到一个方程的多个解
方法/步骤
用Python解数学方程,需要用到Python的一个库——SymPy库。
SymPy是符号数学的Python库,它的目标是成为一个全功能的计算机代数系统,同时保持代码简洁、易于理解和扩展。
如果你的电脑上还没有安装sympy库,那就赶紧安装吧,安装命令:
pip3 install sympy
先来解一个简单点的方程吧。
题目: 5x + 20 = 100
先直接上代码:
from sympy import *
x = Symbol('x')
print(solve([5*x + 20 - 100], [x]))
再来一个复杂点的二元一次方程吧。
题目:3x + 4y =49, 8x- y = 14
代码如下:
from sympy import *
x = Symbol('x')
y = Symbol('y')
print(solve([3*x + 4*y - 49, 8*x - y - 14], [x, y]))
有没有发现规律呢,简单总结一下:
1)变量赋值,使用symbol函数转换;
2)将方程式移到方程的左边,使右边等于0;
3)使用solve函数解方程。
当然了,python的基础语法必须掌握,至少需要掌握python最基础的算数运算符。
+ 加 ---- 两个对象相加
- 减 ----- 得到负数或是一个数减去另一个数
* 乘 ----- 两个数相乘或是返回一个被重复若干次的字符串
/ 除 ----- x 除以 y
% 取模 ----- 返回除法的余数
** 幂 ----- 返回x的y次幂
log() 对数-----对数 log()
下面来个难度大点的方程。
代码如下:
from sympy import *
t = Symbol('t')
x = Symbol('x')
m = integrate(sin(t)/(pi-t), (t, 0, x))
print(integrate(m, (x, 0, pi)))
用python来解决问题?
代码如下:
s=[1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,15,16,17,18,19,20,1]
s1 = []
for i in range(1,len(s) + 1):
if i % 5 == 0:
s1.append(s[i-5:i])
print(s1)
输出:
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15], [16, 17, 18, 19, 20]]
使用python算法如何解
解决方案
从一些测试案例开始总是好的做法。让我们从小的案例开始,看看能否找到某种规律。
. N = 1,1种爬楼方式:[1]
. N = 2,2种爬楼方式:[1,1],[2]
. N = 3,3种爬楼方式:[1,2],[1,1,1],[2,1]
. N = 4,5种爬楼方式:[1,1,2],[2,2],[1,2,1],[1,1,1,1],[2,1,1]
你有没有注意到什么?请看N = 3时,爬完3阶楼梯的方法数量是3,基于N = 1和N = 2。存在什么关系?
爬完N = 3的两种方法是首先达到N = 1,然后再往上爬2步,或达到N = 2再向上爬1步。所以 f(3) = f(2) + f(1)。
这对N = 4是否成立呢?是的,这也是成立的。因为我们只能在达到第三个台阶然后再爬一步,或者在到了第二个台阶之后再爬两步这两种方式爬完4个台阶。所以f(4) = f(3) + f(2)。
所以关系如下: f(n) = f(n – 1) + f(n – 2),且f(1) = 1和f(2) = 2。这就是斐波那契数列。
def fibonacci(n):
if n = 1:
return 1
return fibonacci(n - 1) + fibonacci(n - 2)
当然,这很慢(O(2^N))——我们要做很多重复的计算!通过迭代计算,我们可以更快:
def fibonacci(n):
a, b = 1, 2
for _ in range(n - 1):
a, b = b, a + b
return a
现在,让我们尝试概括我们学到的东西,看看是否可以应用到从集合X中取步数这个要求下的爬楼梯。类似的推理告诉我们,如果X = {1,3,5},那么我们的算法应该是f(n) = f(n – 1) + f(n – 3) + f(n – 5)。如果n0,那么我们应该返回0,因为我们不能爬负数。
def staircase(n, X):
if n 0:
return 0
elif n == 0:
return 1
elif n in X:
return 1 + sum(staircase(n - x, X) for x in X if x n)
else:
return sum(staircase(n - x, X) for x in X if x n)
这也很慢(O(|X|^N)),因为也重复计算了。我们可以使用动态编程来加快速度。
每次的输入cache[i]将包含我们可以用集合X到达台阶i的方法的数量。然后,我们将使用与之前相同的递归从零开始构建数组:
def staircase(n, X):
cache = [0 for _ in range(n + 1)]
cache[0] = 1
for i in range(n + 1):
cache[i] += sum(cache[i - x] for x in X if i - x 0)
cache[i] += 1 if i in X else 0
return cache[-1]
现在时间复杂度为O(N * |X|),空间复杂度为O(N)。
计算化学,有python基础还有必要学习matlab么
(利益相关:我 matlab 和 python 都用,我是搬砖的不是写代码的)
从我一些搞计算化学的朋友那里看,基本用的都是 fortran, c/c++,或者就是商用的量化从头计算软件 Gaussian, Molpro, Cfour 等等
计算化学大体上分成三块:
1.搞算法的。这帮人基本上是数学家+计算机科学家,涉及最底层的代码、算法、数据结构,自然得用底层语言 c 或者 fortran 等等
2.搞量化从头计算的。这帮人大体是用已经开发好的量化计算软件(如开头所述)。量化从头计算涉及专业性很强的解薛定谔方程的算法,据个人所知,matlab 这种大型商业公司的软件花精力去专门做一个量化从头计算的包肯定是亏本的(相比而言经济学、统计学等等的包还有点搞头)。不过印象中也有看到过用 matlab 做很粗浅的量化计算的文献。
3. 搞分子动力学模拟的。这帮人主要是用经典力学方法计算。用啥语言的都有。
对于 2 和 3 来说,个人以为,选择什么语言通常会考量它的计算效率、易用性和扩展性,以及——组里以前用的啥!matlab 做矩阵运算非常好,但价格不菲啊!python 现在越来越流行,又是免费的,但是单纯用 python 计算速度可能会差一点。此外,它们应该都没有量化从头计算对应的扩展包。
如果你的方向更多的是用现成的量化计算软件去算新的化学反应体系,那 matlab 估计不怎么用得到。如果你的方向更多的偏向于统计,并且设计很多自己写代码的部分,那选择一个自己熟悉的、运算速度满足项目需求的语言就可以了。毕竟 matlab 和 python 都有接口直接调用 c/c++,你要嫌慢最后总归回到最底层上面去。
题外话,计算化学找不到出路都转码农去了。如果你真的对编程感兴趣,底层语言一定是要学的。千万不要停留在 matlab 这种要花钱的解释性语言上面。如果你对商业感兴趣,用 matlab 可以干很多别的事儿(不过 python 应该也都能干,数据挖掘什么的)
最后说一句:大部分时候,说某某语言慢的人,都是自己代码写得烂。本人曾优化了组里留下来的 matlab 代码,把速度提了几十倍。每种语言都有其长处,但最终你的算法写得好,才能真正跑起来。