49557


<https://www.cs.unm.edu/~neal.holts/dga/benchmarkFunction/griewank.html>  
上記のサイトを参考にGriewankの3Dグラフをpythonで出力しようとしたのですがエラーが出ます  
全く原因が分からないので詳しい方がいましたら教えてください  
お願いします

ソースコード

[code]

    import numpy as np
    import random
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    import math
    
    def func1(self, chromosome):
        """F6 Griewank's function
        multimodal, symmetric, inseparable"""
        part1 = 0
        for i in range(len(chromosome)):
            part1 += chromosome[i]**2
            part2 = 1.0
    
        for i in range(len(chromosome)):
            part2 *= math.cos(float(chromosome[i]) / math.sqrt(i+1.0))
    
        return 1 + (float(part1)/4000.0) - float(part2)
    
    x = np.arange(-3.0, 3.0, 0.1)
    y = np.arange(-3.0, 3.0, 0.1)
    
    X, Y = np.meshgrid(x, y)
    Z = func1(X, Y)
    
    fig = plt.figure()
    ax = Axes3D(fig)
    
    ax.set_xlabel("x")
    ax.set_ylabel("y")
    ax.set_zlabel("z")
    
    ax.plot_wireframe(X, Y, Z)
    plt.show()
    
[/code]

エラー

TypeError Traceback (most recent call last) ＜ipython-input-46-c8c05ada4569＞ in
＜module＞()  
22  
23 X, Y = np.meshgrid(x, y)  
\---> 24 Z = func1(X, Y)  
25  
26 fig = plt.figure()

＜ipython-input-46-c8c05ada4569＞ in func1(self, chromosome)  
14  
15 for i in range(len(chromosome)):  
\---> 16 part2 *= math.cos(float(chromosome[i]) / math.sqrt(i+1.0))  
17  
18 return 1 + (float(part1)/4000.0) - float(part2)

TypeError: only size-1 arrays can be converted to Python scalars


CC BY-SA 4.0
2018-10-23T03:06:23.197
49552
2018-10-23T10:13:37.737
26483
question
python python3 matplotlib
pythonでGriewankを3dグラフで出力する際にエラー


func1がベクトル演算に対応していません。ベクトル演算に対応させるためには、`math.cos`ではなくnumpyの`np.cos`を使うようにします。

2次元用のコードのサンプルは以下のようになります。

[code]

    import numpy as np
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    
    def func1(X, Y):
        """F6 Griewank's function
        multimodal, symmetric, inseparable"""
        c = np.sqrt(2.0)
        return 1 + (X*X + Y*Y)/4000.0 - np.cos(X/c) * np.cos(Y/c)
    
    x = np.arange(-3.0, 3.0, 0.1)
    y = np.arange(-3.0, 3.0, 0.1)
    
    X, Y = np.meshgrid(x, y)
    Z = func1(X, Y)
    
    fig = plt.figure()
    ax = Axes3D(fig)
    
    ax.set_xlabel("x")
    ax.set_ylabel("y")
    ax.set_zlabel("z")
    
    ax.plot_wireframe(X, Y, Z)
    plt.show()
    
[/code]

もし、元に関数`func1`を変更せずに使いたい場合は、次のように各要素毎に`func1`を計算する必要があります。

[code]

    import numpy as np
    import matplotlib.pyplot as plt
    from mpl_toolkits.mplot3d import Axes3D
    import math
    
    def func1(chromosome):
        """F6 Griewank's function
        multimodal, symmetric, inseparable"""
        part1 = 0
            for i in range(len(chromosome)):
                part1 += chromosome[i]**2
                part2 = 1.0
    
            for i in range(len(chromosome)):
                part2 *= math.cos(float(chromosome[i]) / math.sqrt(i+1.0))
    
            return 1 + (float(part1)/4000.0) - float(part2)
    
    x = np.arange(-3.0, 3.0, 0.1)
    y = np.arange(-3.0, 3.0, 0.1)
    
    X, Y = np.meshgrid(x, y)
    Z = np.empty(X.shape)
    for i in range(len(X)):
      for j in range(len(Y)):
          Z[i,j] = func1([X[i,j], Y[i,j]])
    
    fig = plt.figure()
    ax = Axes3D(fig)
    
    ax.set_xlabel("x")
    ax.set_ylabel("y")
    ax.set_zlabel("z")
    
    ax.plot_wireframe(X, Y, Z)
    plt.show()
    
[/code]


CC BY-SA 4.0
2018-10-23T05:19:50.820
49557
2018-10-23T10:13:37.737
2018-10-23T10:13:37.737
15171
15171
49552
answer