Построение функции по нескольким константам - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь построить свою функцию f(x), используя несколько значений для единственной константы на одном графике.Я делал это раньше, и это работало нормально.Но при использовании того же метода с использованием этой функции я получаю сообщение об ошибке:

x и y должны иметь одинаковое первое измерение, но иметь формы (1000,) и (1,)

import matplotlib.pyplot as plt
import scipy as s

x = s.linspace(0,2* s.pi, 1000)
m = [1.1, 1.2, 1.3, 1.5, 2.0]
m = s.asarray(m)
m = m[:, s.newaxis]

def f(x): 
    return [m**2 /(4*s.cos(x/2))] [ (m*s.cos(x/2) - 1)*(m - s.cos(x/2))] / (1 + m**2 - 2*m*s.cos(x/2))**2

plt.plot(x,m[0], x,m[1], x,m[2], x,m[3], x,m[4])
plt.show()

РЕДАКТИРОВАТЬ:

При попытке установить m=1.1 вместо списка и построить его только для одного значения m, я получаю следующее сообщение об ошибке.

Ошибка типа: в скалярный индекс могут быть преобразованы только целочисленные скалярные массивы

Вот мой код для этого.

import matplotlib.pyplot as plt
import scipy as s

x = s.linspace(0,2* s.pi, 1000)
m=1.1

def f(x): 
    return [m**2 /(4*s.cos(x/2))] [ (m*s.cos(x/2) - 1)*(m - s.cos(x/2))] / ( 1 + m**2 - 2*m*s.cos(x/2))**2

plt.plot(x,f(x))
plt.show()

Это проливает свет на мою проблему?


Что я здесь не так делаю?Спасибо!

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Я не думаю, что ваша функция возвращает то, что вы хотите.При обратном вызове вы пытаетесь проиндексировать ваш первый массив, используя вычисленные значения, что приводит к ошибке TypeError: only integer scalar arrays can be converted to a scalar index, например, [1,2,3,4][1] дает вам 2, но [1,2,3,4][1.5] выдает ошибку.

Если я использую ваш исходный массив для индексации, я получаю хорошие, чистые строки, основанные на константах значений

import matplotlib.pyplot as plt
import numpy as np
import scipy as s

x = s.linspace(0,2* s.pi, 1000)
m = [1.1, 1.2, 1.3, 1.5, 2.0]
m = np.array(m).reshape(-1,1)

def f(x): 
    return  np.array([m**2 /(4*s.cos(x/2))][0]).T.dot(np.array([ (m*s.cos(x/2) - 1)*(m - s.cos(x/2))] / (1 + m**2 - 2*m*s.cos(x/2))**2)[0])

plt.plot(x,m[0]*x, x,m[1]*x, x,m[2]*x, x,m[3]*x, x,m[4]*x)
plt.show()

график здесь

0 голосов
/ 26 сентября 2018

Передать константу в качестве параметра:

def f(x, m):
    numerator = m**2*(m*s.cos(x/2) - 1)*(m - s.cos(x/2))
    denominator = 4*s.cos(x/2)*(1 + m**2 - 2*m*s.cos(x/2))**2
    return numerator/denominator

fig, ax = plt.subplots()
m_arr = s.asarray([1.1, 1.2, 1.3, 1.5, 2.0])
for const_m in m_arr:
    ax.plot(x, f(x, const_m))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...