首页 > 解决方案 > 我的代码中不断出现类型错误警告

问题描述

在我的 python 代码中,我不断收到以下错误:

TypeError:没有找到与指定签名和转换匹配的循环,用于 ufunc svd_n

代码如下:

import numpy as np
from numpy.linalg import norm

def sdm_3eqs():
    def f_bold(x):
        return [15*x[0] + x[1]**2 - 4*x[2] - 15, x[0]**2 + 10*x[1] - x[2] - 10, x[1]**3 - 25*x[2] + 24]
    
    def f(x):
        f_n = []
        for i in range(len(x)):
            f_i = f_bold[i]**2
            f_n.append(f_i)
    
        return np.sum(f_n)
    
    def M(x):
        m = np.array([[15, 2*x[0], 0], [2*x[1], 10, 3*x[1]**2], [-4, -1, -25]])
        return m
    
    def grad_f(x):
        return 2*M(x)*f_bold(x)
    
    def d(x):
        return -grad_f(x)/norm(grad_f(x), ord=2)
    
    def s_prime(x, alpha, d):
        return grad_f(x + alpha*d)*d
    
    x = [0.5, 0.5, 0.5]
    iter = 0
    err = 100

    while err > 0.005:
        x_k = x
        d_k = d(x_k)

        m = 0
        sprime = 300
        alpha_l = 0
        alpha_u = 1.5
        alpha = (alpha_l+alpha_u)/2
        while abs(sprime) > 0.0005:
            alpha = (alpha_l+alpha_u)/2
            sprime = s_prime(x_k, alpha, d_k)[0][0]

            if abs(sprime) < 0.001:
                break
            elif sprime > 0:
                alpha_u = alpha
            else:
                alpha_l = alpha
            
            m += 1
        
        iter += 1
        x = x_k + alpha*d_k
        err = norm(grad_f(x), ord=2)/max(1, norm(f_bold(x), ord=2))
    
    print(f'f_bold: {f_bold(x)}')

sdm_3eqs()

我不确定为什么,但它说类型错误来自代码中的第 57 行:

err = norm(grad_f(x), ord=2)/max(1, norm(f_bold(x), ord=2))

如果有人可以提供帮助,那就太好了!

编辑:

Traceback (most recent call last):
  File "/Users/aidanpayne/Desktop/Scripts/Python/University of Greenwich/MATH1157/Scripts/Steepest Descent Method.py", line 61, in <module>
    sdm_3eqs()
  File "/Users/aidanpayne/Desktop/Scripts/Python/University of Greenwich/MATH1157/Scripts/Steepest Descent Method.py", line 57, in sdm_3eqs
    err = norm(grad_f(x), ord=2)/max(1, norm(f_bold(x), ord=2))
  File "<__array_function__ internals>", line 5, in norm
  File "/Users/aidanpayne/opt/anaconda3/lib/python3.8/site-packages/numpy/linalg/linalg.py", line 2579, in norm
    ret =  _multi_svd_norm(x, row_axis, col_axis, amax)
  File "/Users/aidanpayne/opt/anaconda3/lib/python3.8/site-packages/numpy/linalg/linalg.py", line 2355, in _multi_svd_norm
    result = op(svd(y, compute_uv=False), axis=-1)
  File "<__array_function__ internals>", line 5, in svd
  File "/Users/aidanpayne/opt/anaconda3/lib/python3.8/site-packages/numpy/linalg/linalg.py", line 1673, in svd
    s = gufunc(a, signature=signature, extobj=extobj)
TypeError: No loop matching the specified signature and casting was found for ufunc svd_n

标签: pythonnumpy

解决方案


看起来该M(x)函数正在返回一个结构的 3 维数组

[
  [   a    [b c d]    e   ]
  [[f g h]    i    [k l m]]
  [   n       o       p   ]
]

然后您尝试将其与结果进行矩阵相乘f_bold(x)并计算范数。

我相信这个错误与试图计算这个不规则矩阵的范数有关。特别是,检查您的函数定义M(x)以验证其返回数组的形状/规则性。

line 17: m = np.array([[15, 2*x[0], 0], [2*x[1], 10, 3*x[1]**2], [-4, -1, -25]])
                              ^^^^         ^^^^        ^^^^

推荐阅读