Python 使用matplotlib在等高线上绘制矢量场的正确方法

Python 使用matplotlib在等高线上绘制矢量场的正确方法,python,matplotlib,plot,Python,Matplotlib,Plot,我正在实现最速下降,我想在等高线图上绘制到解决方案的路径。为此,我在For循环中保存了必要的数据,然后我尝试在等高线图上绘制路径(一组正交向量),但我把事情搞砸了(向量头应该到其他向量尾): 内椭圆内的直线是向量。我想要这样的东西: 将numpy导入为np 将matplotlib.pyplot作为plt导入 从matplotlib导入cm 从matplotlib导入rc 从mpl_toolkits.mplot3d导入Axes3D 从matplotlib.ticker导入LinearLocat

我正在实现最速下降,我想在等高线图上绘制到解决方案的路径。为此,我在For循环中保存了必要的数据,然后我尝试在等高线图上绘制路径(一组正交向量),但我把事情搞砸了(向量头应该到其他向量尾):

内椭圆内的直线是向量。我想要这样的东西:

将numpy导入为np
将matplotlib.pyplot作为plt导入
从matplotlib导入cm
从matplotlib导入rc
从mpl_toolkits.mplot3d导入Axes3D
从matplotlib.ticker导入LinearLocator,FormatStrFormatter
def列(矩阵,i):
返回[矩阵中行的行[i]
def计算功能(A、b、x_ini、x_end、y_ini、y_end、分数率):
“”“计算Ax-b=0线性系统的函数值
:参数A:系数矩阵
:参数b:独立项
:param x_ini:x初始值
:param x_end:x end值
:param y_ini:y初始值
:param y_end:y end值
:返回:返回x1、x2和fq(功能性)
"""
x1,x2=np.meshgrid(np.arange(x_-ini,x_-end,x点的速率),np.arange(y_-ini,y_-end,x点的速率))
fq=np.零(np.形状(x1))
对于x范围内的i(len(x1)):
对于x范围内的j(len(x2)):
x=np.数组([x1[i][j],x2[i][j]]
fq[i][j]=np.dot(x,np.dot(A,x))-2*np.dot(x,b)
返回(x1、x2、fq)
def最陡下降(A、b、x、x1、x2、fq、tol、maxit):
“”“通过最速下降法求解线性系统Ax-b=0
:参数A:系数矩阵
:参数b:独立项
:param x_ini:x初始值
:param x1:x1的网格
:param x2:x2的网格
:param fq:功能网格的网格
:参数tol:溶液的公差
:param maxit:允许的最大迭代次数
"""
打印('运行最陡下降')
数据=[]
打印(“k\txk0\t\t\txk1\t\t\tvk0\t\t\tvk1\t\t\t”)
对于范围内的k(最大值):
vk=b-np.dot(A,x)
vkAvk=np.dot(np.transpose(vk),np.dot(A,vk))
如果vkAvk==0:
打破
tk=np.dot(np.transpose(vk),vk)/vkAvk
校正=tk*vk
xnew=x+校正
data.append(np.array([float(x[0])、float(x[1])、float(correction[0])、float(correction[1]))
xdiffnorm=np.max(np.abs(xnew-x))
xnorm=np.max(np.abs(xnew))
错误=xdiffnorm/xnorm
打印(“%d\t%f\t%f\t%f\t%f\t%f\t%f”)%(k,x[0],x[1],vk[0],vk[1],错误)
x=xnew
如果错误
你应该发布一个最小的、完整的和有效的代码,我放了一个最小的、完整的和有效的代码(很抱歉以前没有这样做)。你应该发布一个最小的、完整的和有效的代码,我放了一个最小的、完整的和有效的代码(很抱歉以前没有这样做)。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib import rc
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.ticker import LinearLocator, FormatStrFormatter

def column(matrix, i):
    return [row[i] for row in matrix]

def compute_functional(A, b, x_ini, x_end, y_ini, y_end, rate_of_points):
    """Computes functional values for Ax - b = 0 linear system

    :param A: matrix of coefficients
    :param b: independent term
    :param x_ini: x initial value
    :param x_end: x end value
    :param y_ini: y initial value
    :param y_end: y end value
    :return: Returns x1, x2 and fq (functional)
    """
    x1, x2 = np.meshgrid(np.arange(x_ini, x_end, rate_of_points), np.arange(y_ini, y_end, rate_of_points))
    fq = np.zeros(np.shape(x1))


    for i in xrange(len(x1)):
        for j in xrange(len(x2)):
            x = np.array([x1[i][j], x2[i][j]])
            fq[i][j] = np.dot(x, np.dot(A, x)) - 2 * np.dot(x, b)

    return (x1, x2, fq)


def steepest_descent(A, b, x, x1, x2, fq, tol, maxit):
    """ Solves a linear system Ax - b = 0 by steepest descent method

    :param A: matrix of coefficients
    :param b: independent term
    :param x_ini: x initial values
    :param x1: mesh grid for x1
    :param x2: mesh grid for x2
    :param fq: mesh grid for functional
    :param tol: tolerance of solution
    :param maxit: maximum number of allowed iterations
    """
    print('Running Steepest Descent.')
    data = []
    print("k\txk0\t\t\txk1\t\t\tvk0\t\t\tvk1\t\t\terror")
    for k in range(maxit):
        vk = b - np.dot(A, x)
        vkAvk = np.dot(np.transpose(vk), np.dot(A, vk))

        if vkAvk == 0:
            break

        tk = np.dot(np.transpose(vk), vk) / vkAvk
        correction = tk * vk
        xnew = x + correction

        data.append(np.array([float(x[0]), float(x[1]), float(correction[0]), float(correction[1])]))

        xdiffnorm = np.max(np.abs(xnew - x))
        xnorm = np.max(np.abs(xnew))
        error = xdiffnorm / xnorm

        print("%d\t%f\t%f\t%f\t%f\t%f") % (k, x[0], x[1], vk[0], vk[1], error)

        x = xnew

        if error < tol: break

    # plot contour
    plt.figure()
    plt.contour(x1, x2, fq, colors='k')
    plt.quiver(column(list(data),0),column(list(data),1),column(list(data),2),column(list(data),3), width=0.01, headwidth=5, scale=1, units='xy')

    plt.show()
    plt.close()
    return x


#Creating linear system
A = np.array([[3,2],[2,6]])
b = np.array([[2],[8]])
x = np.ones((np.shape(A)[0], 1))

#Configuring parameteres
tol = 0.001
maxit = 100
x_ini = -2
x_end = 2
y_ini = -2
y_end = 2
rate_of_points = 0.25

x1, x2, fq = compute_functional(A, b, x_ini, x_end, y_ini, y_end, rate_of_points)
steepest_descent(A, b, x, x1, x2, fq, tol, maxit)