найти x с учетом y функции в python без библиотеки - PullRequest
0 голосов
/ 06 мая 2020

введите здесь описание изображения для моего листа упражнений, мне нужно написать функцию, которая находит значение x для данного значения y функции (называемой Maxwell_Boltzmann) без какой-либо библиотечной функции. Поэтому я попытался определить функцию (называемую most_probable_speed), которая сначала находит максимальное значение y значения Maxwell_Boltzmann, а затем находит, для какого x (который в моем коде определяется как v) достигается максимум. Я сделал это с помощью for, и если l oop пытается напечатать v, но он не печатает мне параметр v, для которого достигается максимальное значение, но дает мне весь вектор v. Кто-нибудь знает, как я могу напечатать параметр v , для которого достигается y?

мой код:

import numpy as np
import matplotlib.pyplot as plt
import scipy
import scipy.constants as cs

v= np.linspace(-100,10000,1000) #this are my x values


#this is my function, which prints y value in fonction of x
def Maxwell_Boltzmann(v, m, T):
      ''' calculate the Maxwell-Boltzmann  distribution
      for the speed of the chemical elements

      3 parameters: -the speed of the particle
              -its masse
              -its temperature'''
      y = np.sqrt(2/np.pi) * (m /( cs.k * T))**(3/2) * v**2 * np.exp(-m*v**2/(2 * cs.k * T)) 
      return y;




# this is the function which is suppose to find the x value given the y value
def most_probable_speed(v,m,T):
       '''determine the most probable speed of a given mass and temperature'''

       x = Maxwell_Boltzmann(v, m, T) #put the y values of Maxwel_B for all x in an array named x
       highest_probability = np.amax(x) #Return the maximum value of y


       # I want to print the value of v for whcih Maxwell_Boltzmann(v, m, T)= highest_probability
       for a in Maxwell_Boltzmann(v, m, T):
           if a == highest_probability:
               print(v)
           else:
               continue

return highest_probability;


m_oxy = 15.99 * cs.u 
most_probable_speed(v, m = m_oxy, T = 273)  

1 Ответ

1 голос
/ 06 мая 2020

Поскольку каждый элемент y соответствует элементу v в том же индексе (который является желаемым значением x), вы можете использовать enumerate, чтобы дать вам индекс каждого значения и распечатать соответствующий x а не весь вектор:

def most_probable_speed(v,m,T):
       '''determine the most probable speed of a given mass and temperature'''

       x = Maxwell_Boltzmann(v, m, T) #put the y values of Maxwel_B for all x in an array named x
       highest_probability = np.amax(x) #Return the maximum value of y


       # I want to print the value of v for whcih Maxwell_Boltzmann(v, m, T)= highest_probability
       for idx, a in enumerate(Maxwell_Boltzmann(v, m, T)):
           if a == highest_probability:
               print(v[idx])
           else:
               continue

Однако вы дважды вызываете функцию Maxwell_Boltzmann. Если вы просто хотите найти x, соответствующий наивысшему значению y, вы можете сделать это гораздо эффективнее следующим образом:

def most_probable_speed(v,m,T):
       '''determine the most probable speed of a given mass and temperature'''

       x = Maxwell_Boltzmann(v, m, T) #put the y values of Maxwel_B for all x in an array named x
       highest_probability_idx = np.argmax(x) # Return the index of the maximum value of y
       print(v[highest_probability_idx])

Здесь np.argmax возвращает индекс максимальное значение в возвращаемом массиве, которое затем можно использовать для доступа к соответствующему x в вашем v векторе

...