python - 如何优化这些循环?
问题描述
我是 python 的新手,但仍然想做最简单的方法。
下面我发布我的代码,如果 some1 可以查看它并找出这里出了什么问题,那将有很大帮助。
问题:我必须解决非线性方程组,这是我的代码在给定示例中所做的。但是当谈到解决我自己的练习时,它并没有收敛,这意味着X(i-1)/x(1)
->1
没有实现。
另一件事是,它实际上会在第 5 次迭代时停止计算,但我没有指定关于第 5 次迭代的任何内容,当前 3 次迭代顺利进行时。我认为它存储了某种形式的大量记忆……但这只是我的猜测。
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
#Needed variables and constants
n = 2
a1 = 0.04
a2 = 0.04
As1 = 19.64 * 10**(-4)
As2 = 12.64 * 10**(-4)
e0 = 0.07
b = 0.3
h = 0.5
Ned = 1990 * 10**3
fcd = 7.2 * 10**6
Ecm = 27 * 10**9
Es = 200 * 10**9
d = h - a1
e = (h/2) + e0
Eps2 = 0.002
Eps35 = 0.0035
d_x0 = 5 * 10**(-3)
d_r0 = 5 * 10**(-5)
fyd = 650 * 10**6
#Calculations
def x(i):
if i == 1:
return h
return x(i - 1) + d_x(i-1)
def r(i):
if i == 1:
return (Ned * e) / ((Ecm * b * (h ** 3)) / 12)
return r(i - 1) + d_r(i-1)
def d_x(i):
A = np.array([[f1_x(i), f1_r(i)], [f2_x(i), f2_r(i)]])
B = np.array([-f1(i), -f2(i)])
C = np.linalg.solve(A, B)
return C[0]
def d_r(i):
A = np.array([[f1_x(i), f1_r(i)], [f2_x(i), f2_r(i)]])
B = np.array([-f1(i), -f2(i)])
C = np.linalg.solve(A, B)
return C[1]
def Nb(i):
return (b * fcd / r(i)) * (r(i) * h - (Eps2 / (n + 1)) * (1 - (r(i) * (x(i) - h)) / Eps2) ** (n + 1))
def Mb(i):
return (b * fcd / (r(i) ** 2)) * (-(((Eps2 - r(i) * (x(i) - h)) ** (n + 1)) * (r(i) * (x(i) - h) * (n + 1) + Eps2) / ((n + 2) * (n + 1) * (Eps2 ** n))) + (r(i) ** 2) * h * (x(i) - h / 2))
def Ns1(i):
return Es * r(i) * (x(i) - d) * As1
def Ns2(i):
return Es * r(i) * (x(i) - a2) * As2
def Ms1(i):
return Es * r(i) * ((x(i) - d) ** 2) * As1
def Ms2(i):
return Es * r(i) * ((x(i) - a2) ** 2) * As2
def f1(i):
return Nb(i) + Ns1(i) + Ns2(i) - Ned
def f2(i):
return Mb(i) + Ms1(i) + Ms2(i) - (Ned * (x(i) - (h / 2) + e0))
# Derivatives of all the required elements
def Ns1_x(i):
return Es * r(i) * As1
def Ns1_r(i):
return Es * As1 * (x(i) - d)
def Ns2_x(i):
return Es * r(i) * As2
def Ns2_r(i):
return Es * As2 * (x(i) - a2)
def Ms1_x(i):
return Es * r(i) * As1 * 2 * (x(i) - d)
def Ms1_r(i):
return Es * As1 * (x(i) - d) ** 2
def Ms2_x(i):
return Es * r(i) * As2 * 2 * (x(i) - a2)
def Ms2_r(i):
return Es * As2 * (x(i) - a2) ** 2
def Nb_x(i):
return (((b * fcd / r(i)) * (r(i) * h - (Eps2 / (n + 1)) * (1 - (r(i) * ((x(i) + d_x0) - h)) / Eps2) ** (n + 1))) -((b * fcd / r(i)) * (r(i) * h - (Eps2 / (n + 1)) * (1 - (r(i) * ((x(i) - d_x0) - h)) / Eps2) ** (n + 1)))) / (2 * d_x0)
def Nb_r(i):
return (((b * fcd / (r(i) + d_r0)) * ((r(i) + d_r0) * h - (Eps2 / (n + 1)) * (1 - ((r(i) + d_r0) * (x(i) - h)) / Eps2) ** (n + 1))) -((b * fcd / (r(i) - d_r0)) * ((r(i) - d_r0) * h - (Eps2 / (n + 1)) * (1 - ((r(i) - d_r0) * (x(i) - h)) / Eps2) ** (n + 1)))) / (2 * d_r0)
def Mb_x(i):
return ((b * fcd / (r(i) ** 2)) * (-(((Eps2 - r(i) * ((x(i) + d_x0) - h)) ** (n + 1)) * (r(i) * ((x(i) + d_x0) - h) * (n + 1) + Eps2) / ((n + 2) * (n + 1) * (Eps2 ** n))) + (r(i) ** 2) * h * ((x(i) + d_x0) - h / 2)) -(b * fcd / (r(i) ** 2)) * (-(((Eps2 - r(i) * ((x(i) - d_x0) - h)) ** (n + 1)) * (r(i) * ((x(i) - d_x0) - h) * (n + 1) + Eps2) / ((n + 2) * (n + 1) * (Eps2 ** n))) + (r(i) ** 2) * h * ((x(i) - d_x0) - h / 2))) / (2 * d_x0)
def Mb_r(i):
return ((b * fcd / ((r(i) + d_r0) ** 2)) * (-(((Eps2 - (r(i) + d_r0) * (x(i) - h)) ** (n + 1)) * ((r(i) + d_r0) * (x(i) - h) * (n + 1) + Eps2) / ((n + 2) * (n + 1) * (Eps2 ** n))) + ((r(i) + d_r0) ** 2) * h * (x(i) - h / 2)) -(b * fcd / ((r(i) - d_r0) ** 2)) * (-(((Eps2 - (r(i) - d_r0) * (x(i) - h)) ** (n + 1)) * ((r(i) - d_r0) * (x(i) - h) * (n + 1) + Eps2) / ((n + 2) * (n + 1) * (Eps2 ** n))) + ((r(i) - d_r0) ** 2) * h * (x(i) - h / 2))) / (2 * d_r0)
def f1_x(i):
return Nb_x(i) + Ns1_x(i) + Ns2_x(i)
def f1_r(i):
return Nb_r(i) + Ns1_r(i) + Ns2_r(i)
def f2_x(i):
return Mb_x(i) + Ms1_x(i) + Ms2_x(i) - Ned
def f2_r(i):
return Mb_r(i) + Ms1_r(i) + Ms2_r(i)
# Results of iterations
def Eps_C2(i):
return x(i) * r(i)
def Eps_C1(i):
return (x(i) - h) * r(i)
def Sig_S1(i):
return Es * r(i) * (x(i) - d)
def Sig_S2(i):
return Es * r(i) * (x(i) - a2)
for i in range(1,10):
print('Iteration', i)
print(Mb(i))
print(Mb_r(i))
print(d_r(i))
解决方案
猜测您正在浪费大量时间重新评估相同的,恒定的表达式。其中一些调用看起来是递归的,你只是在浪费大量的计算工作。如果你想以自己的风格编写代码,Python 并不是最好的语言——这可能是我在数学上的想法,但对于计算机来说,这是一种糟糕的计算方式
作为 hack,您可以尝试在每个函数周围放置一个缓存,例如:
from functools import lru_cache
@lru_cache()
def x(i):
if i == 1:
return h
return x(i - 1) + d_x(i-1)
(见https://stackoverflow.com/a/9674327/1358308)
如果可行,我建议您重写代码以保存计算值。例如,类似:
n = 10
x = np.zeros(n)
x[0] = h
for i in range(1, n):
x[i] = x[i-1] + 1
推荐阅读
- sql - 使用 DATEADD 和 DATEDIFF 会截断时间
- bootstrap-4 - 从 ngx-bootstrap 使用 typeahead 时如何排序结果?
- mysql - WordPress WooCommerce 暂存站点数据库同步
- pandas - 填充日期时间索引时的值错误
- wordpress - 如何为 wordpress 网站部署 Cloudflare Worker?
- java - 如何在 Angular 应用程序中显示来自 resultSet 的数据
- spring-security - 如果 CAS 不可用,Spring Security 是否可以使用表单登录?
- python-3.x - PYQT:主窗口关闭,同时打开第二个和第三个窗口
- stripe-payments - 条纹。将资金从两个条带余额转移到一个关联账户
- python - 如果队列中的执行延迟了最大时间段,如何丢弃计划的 celery 任务?