python - 导数矩阵的python迭代
问题描述
这是我的代码。我想以矩阵形式同时迭代函数 f(x) 及其导数矩阵。我怎样才能做到这一点?
import numpy as np
import sympy as sp
x=sp.Symbol('x')
k=[]
def m1(x):
return 4*x**2 + 8*x
def m2(x):
return 8*x**2 + 6*x
def m3(x):
return x**2 + 10*x
def m4(x):
return 10*x**2 + x
def dm1(x):
return sp.diff(m1(x),x)
def dm2(x):
return sp.diff(m2(x),x)
def dm3(x):
return sp.diff(m3(x),x)
def dm4(x):
return sp.diff(m4(x),x)
def f(x):
return([[m1(x),m2(x)],[m3(x),m4(x)]]) # function matrix
def k(x):
return ([[dm1(x),dm2(x)],[dm3(x),dm4(x)]]) # derivative matrix
解决方案
import numpy as np
import sympy as sp
x=sp.Symbol('x')
k=[]
tol = 1e-3
def m1(x):
return 4*x**2 + 8*x
def m2(x):
return 8*x**2 + 6*x
def m3(x):
return x**2 + 10*x
def m4(x):
return 10*x**2 + x
def dm1(val):
return m1(x).diff(x).subs(x,val)
def dm2(val):
return m2(x).diff(x).subs(x,val)
def dm3(val):
return m3(x).diff(x).subs(x,val)
def dm4(val):
return m4(x).diff(x).subs(x,val)
def f(x):
return [m1(x), m2(x), m3(x), m4(x)] # function matrix
def k(val):
return [dm1(val), dm2(val), dm3(val), dm4(val)] # derivative list
x_bar = 5.
x_results = []
for i in range(0,4):
h=1
x_temp = x_bar
print(x_temp)
while (abs(h) > tol):
h = -1.*f(x_temp)[i]/k(x_temp)[i]
print(h)
x_temp = x_temp + h
x_results.append(x_temp)
print(x_results)
print(f(x_results[0]))
编辑:上面单独解决每个函数,而不是像在线性地震反演中那样针对 1 个变量一起解决,以下应该以正确的方式解决它:
import numpy as np
import sympy as sp
x=sp.Symbol('x')
k=[]
tol = 1e-3
def m1(x):
return 4*x**2 + 8*x
def m2(x):
return 8*x**2 + 6*x
def m3(x):
return x**2 + 10*x
def m4(x):
return 10*x**2 + x
def dm1(val):
return m1(x).diff(x).subs(x,val)
def dm2(val):
return m2(x).diff(x).subs(x,val)
def dm3(val):
return m3(x).diff(x).subs(x,val)
def dm4(val):
return m4(x).diff(x).subs(x,val)
def f(x):
return [m1(x), m2(x), m3(x), m4(x)] # function matrix
def k(val):
return [dm1(val), dm2(val), dm3(val), dm4(val)] # derivative list
x_start = 5.
F = np.array(f(x_start))
dF = np.array(k(x_start))
dx = 1.
x_temp = x_start
while abs(dx) > tol:
make_square = np.dot(np.transpose(dF),dF)
print(make_square)
print(type(dF))
if make_square is not np.ndarray:
inverse = 1/make_square
#inverse = np.linalg.inv(make_square)
else:
inverse = np.linalg.inv(make_square)
#inverse = 1/make_square
inv_trans = np.dot(inverse,np.transpose(dF))
dx = -1.*np.dot(inv_trans, F)
print(dx)
x_temp = x_temp + dx
F = np.array(f(x_temp))
dF = np.array(k(x_temp))
print(x_temp)
推荐阅读
- c# - MySql 不更新列 C# MVC 应用程序中的值
- java - Jenkins 警告-ng-plugin 自定义文件夹结构又名多个“源目录”
- reactjs - 下一个 Js 主页给我 404 Page not found
- java - 将 SAML 与 spring 4 一起使用
- javascript - 循环继续,直到找到所有可能的答案
- rest - 使用哪种 HTTP 方法来构建 REST API 以执行以下操作?
- c# - Forge Configurator 的 AppBundles 是如何工作的?
- drupal - 如何在 Drupal 8 中打印特定的段落类型?
- zsh - zsh 接受语法不正确的循环结构
- swift - 无法从 JSON 中的数组中获取一个对象