Генератор случайных чисел Тест задачи построения кода однородности - PullRequest
0 голосов
/ 29 января 2019

Пожалуйста, скажите мне, что не так в моем коде.Спасибо.

Это дает мне эту ошибку при запуске:

Traceback (most recent call last):

    plt.plot(N, Test_Uniform(N))
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/matplotlib/pyplot.py", line 2813, in plot
    is not None else {}), **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/matplotlib/__init__.py", line 1810, in inner
    return func(ax, *args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/matplotlib/axes/_axes.py", line 1611, in plot
    for line in self._get_lines(*args, **kwargs):
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/matplotlib/axes/_base.py", line 393, in _grab_next_args
    yield from self._plot_args(this, kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/matplotlib/axes/_base.py", line 370, in _plot_args
    x, y = self._xy_from_xy(x, y)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/matplotlib/axes/_base.py", line 231, in _xy_from_xy
    "have shapes {} and {}".format(x.shape, y.shape))
ValueError: x and y must have same first dimension, but have shapes (1000,) and (3,)

Это нужно сделать так:

       import matplotlib.pyplot as plt
       import numpy as np

       N=np.random.rand(1000)
       k_array=np.array([1,3,7]) 

       def Test_Uniform(N):
          test_uni=np.array([])  
            for w in k_array:
              test_uni_random=0
                  for i in N:
                    test_uni_random += (i**w)/(len(N))
                  test_uni=np.append(test_uni,test_uni_random)
          return test_uni

      def Test_uniform_Deviation(N):
          new_sum=np.array([])
            for z in k_array:
              test_uni_rand=0
                 for q in N:
                   test_uni_rand += (((q**z)/len(N))-(1/(1+q)))
                   new_sum=np.append(new_sum,test_uni_rand)
                 mean_sum=new_sum/len(N)
         return mean_sum

     plt.plot(N, Test_Uniform(N))
     plt.xlabel('N')
     plt.xscale('log')
     plt.ylabel('series')
     plt.show() 

     plt.plot(N, Test_uniform_Deviation(N))
     plt.xlabel('N')
     plt.xscale('log')
     plt.ylabel('series')
     plt.show()

для каждого k, построить среднее значение r^k найдено против log(N) вдоль линии ожидаемого предела 1/(1+k).и график среднего отклонения (вторая функция) против log(N).

1 Ответ

0 голосов
/ 29 января 2019

Проблема в том, что вы строите N (1000 чисел) против Test_Uniform(N), который возвращает массив из трех чисел, по одному для каждого элемента k_array:

test_uni=np.array([])

for w in k_array:
    test_uni_random = 0

    for i in N:
        test_uni_random += i**w / len(N)
    test_uni = np.append(test_uni, test_uni_random)

return test_uni

Массив test_uniсодержит только один элемент для каждого элемента в k_array.Если бы мы должны были инвертировать циклы:

import matplotlib.pyplot as plt
import numpy as np

N = np.random.rand(1000)
k_array = np.array([1, 3, 7]) 

def Test_Uniform(N):
    test_uni = np.array([])  

    for i in N:
        test_uni_random = 0

        for w in k_array:
            test_uni_random += i ** w / len(N)

        test_uni = np.append(test_uni, test_uni_random)

    return test_uni

plt.plot(N, Test_Uniform(N))
plt.xlabel('N')
plt.xscale('log')
plt.ylabel('series')
plt.show() 

Это может не иметь никакого математического смысла, но, по крайней мере, N и Test_Uniform(N) теперь имеют одинаковое количество элементов и могут быть построены:

enter image description here

...