powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите перевести с [Python] на [Java]
12 сообщений из 12, страница 1 из 1
Помогите перевести с [Python] на [Java]
    #38946647
Sergeyyy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте всем!

Уважаемые помогите, пожалуйста, перевести код с питона на яву. В коде реализована компактная модель нейрона Ижикевича
Там используется Нумпу) Так что чорт его знает можно ли вообще воспроизвести это..
Сей код тута:

Код: python
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
import numpy
 
class IzhikevichNeuron(object):
    def __init__(self, a, b, c, d, v, u = None):
        self.a = a
        self.b = b
        self.c = c
        self.d = d
        self.v = v
        self.u = u if u is not None else b * v
        
class IzhikevichSim(object):
    def __init__(self, nrn, t, dt = 0.25):
        self.neuron = nrn
        self.dt = dt
        self.t = t = numpy.arange(0, t + dt, dt)
        self.stim = numpy.zeros(len(t))
        self.x = 5
        self.y = 140
        self.du = lambda a, b, v, u: a * (b * v - u)
        
    def integrate(self):
        trace = numpy.zeros((2, len(self.t)))
        
        for i in enumerate(self.stim):
            self.neuron.v += self.dt * (0.04 * self.neuron.v ** 2 + self.x * self.neuron.v + self.y - self.neuron.u + self.stim[i[0]])
            self.neuron.u += self.dt * self.du(self.neuron.a, self.neuron.b, self.neuron.v, self.neuron.u)
            
            if self.neuron.v >= 30:
                trace[0, i[0]] = 30
                self.neuron.v = self.neuron.c
                self.neuron.u += self.neuron.d
            else:
                trace[0, i[0]] = self.neuron.v
                trace[1, i[0]] = self.neuron.u
        
        return trace




Заранее благодарю!
...
Рейтинг: 0 / 0
Помогите перевести с [Python] на [Java]
    #38946775
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergeyyy,

А что конкретно вам не понятно?
Два объекта.
1) IzhikevichNeuron - для "хранения данных"
2) IzhikevichSim для расчета
Внешних объектов вроде бы не используется.

Аккуратно перепишите метод integrate из класса IzhikevichSim
Вроде бы все...
...
Рейтинг: 0 / 0
Помогите перевести с [Python] на [Java]
    #38947922
Sergeyyy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mad_nazgul, спасибо большое, да не очень знаком ни с питоном, с jav,ой знаком чуть более, но вот классы эти, эх..Пока изучаю их)
...
Рейтинг: 0 / 0
Помогите перевести с [Python] на [Java]
    #38948129
mad_nazgul
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergeyyymad_nazgul, спасибо большое, да не очень знаком ни с питоном, с jav,ой знаком чуть более, но вот классы эти, эх..Пока изучаю их)

Я его вообще не знаю. ;-)
Но по коду более-менее понятно.
...
Рейтинг: 0 / 0
Помогите перевести с [Python] на [Java]
    #38950114
Sergeyyy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mad_nazgul,

Какая то чушь получается:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
class IzhikevichNeuron {
	public int a;
	public int b;
	public Object c;
	public Object d;
	public int v;
	public Integer u;

	IzhikevichNeuron(int a, int b, Object c, Object d, int v, Integer u) {
		this.a = a;
		this.b = b;
		this.c = c;
		this.d = d;
		this.v = v;
		this.u = u;
		if ((Boolean) (u == null)) {
			this.u = b * v;
		}
	}

	public class IzhikevichSim {
		public double dt;
		public Object neuron;
		public int[] t;
		public int[] stim;
		public int x;
		public int y;
		public int du;

		IzhikevichSim(Object nrn, int t, double dt) {
			this.neuron = nrn;
			this.dt = dt;
			this.t = new int[t];
			this.stim = new int[t];
			this.x = 5;
			this.y = 140;
			this.du = lambdam(a, b, v, u);
		}

		public int lambdam(int a, int b, int v, int u) {
			int c = a * ((b * v) - u);
			return c;
		}

		public int[][] integrate(){
			int trace[][] = new int[2][t.length];
			for (int i = 0, i < this.stim.length, i++){
			this.neuron.v += this.dt * (0.04 * this.neuron.v^2 + this.x * this.neuron.v + this.y - this.neuron.u + this.stim[i])
					 this.neuron.u +=  this.dt *  this.du( this.neuron.a,  this.neuron.b,  this.neuron.v, this.neuron.u)
		            
		            if ( this.neuron.v >= 30){
		                trace[0, i] = 30;
		                this.neuron.v = this.neuron.c;
		                this.neuron.u +=  this.neuron.d;
		            
		            }else{
		                trace[0, i] = this.neuron.v;
		                trace[1, i] =  this.neuron.u;
		            }
			}
					return trace;
			
		}
	}
}
...
Рейтинг: 0 / 0
Помогите перевести с [Python] на [Java]
    #38950145
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вместо возведения в степень в Java надо использовать умножение (если целый показатель)
или функции из пакета java.lang.Math.*.

И было-бы продуктивнее видеть лог компилляции.
...
Рейтинг: 0 / 0
Помогите перевести с [Python] на [Java]
    #38950283
Sergeyyy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton, еще подправил некоторые очевидные ошибки, вот улучшенная версия:


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
class IzhikevichNeuron {
	public int a;
	public int b;
	public Object c;
	public Object d;
	public int v;
	public Integer u;

	IzhikevichNeuron(int a, int b, Object c, Object d, int v, Integer u) {
		this.a = a;
		this.b = b;
		this.c = c;
		this.d = d;
		this.v = v;
		this.u = u;
		if ((Boolean) (u == null)) {
			this.u = b * v;
		}
	}

	public class IzhikevichSim {
		public double dt;
		public Object neuron;
		public int[] t;
		public int[] stim;
		public int x;
		public int y;
		public int du;

		IzhikevichSim(Object nrn, int t, double dt) {
			this.neuron = nrn;
			this.dt = dt;
			this.t = new int[t];
			this.stim = new int[t];
			this.x = 5;
			this.y = 140;
			this.du = lambdam(a, b, v, u);
		}

		public int lambdam(int a, int b, int v, int u) {
			int c = a * ((b * v) - u);
			return c;
		}

		public int[][] integrate(){
			int trace[][] = new int[2][t.length];
			int i;
			int jh = this.stim.length;
			for (i = 0; i < jh; i++){
			         this.neuron.v += this.dt * (0.04 * Math.pow(this.neuron.v,2) + this.x * this.neuron.v + this.y - this.neuron.u + this.stim[i]);
					 this.neuron.u +=  this.dt *  this.du( this.neuron.a,  this.neuron.b,  this.neuron.v, this.neuron.u);
		            
		            if (this.neuron.v >= 30){
		                trace[0][i] = 30;
		                this.neuron.v = this.neuron.c;
		                this.neuron.u +=  this.neuron.d;
		            
		            }else{
		                trace[0][i] = this.neuron.v;
		                trace[1][i] =  this.neuron.u;
		            }
			}
					return trace;
		}
	}
}



А вот пишет в основном такие вещи - v cannot be resolved or is not a field, около neuron.v
...
Рейтинг: 0 / 0
Помогите перевести с [Python] на [Java]
    #38950620
Семён Антонович Сосницкий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergeyyy, просто у тебя переменная neuron имеет тип Object , а в нем поля v нет, о чем и говорит компилятор. Исправь в классе IzhikevichSim :
Код: java
1.
public IzhikevichNeuron neuron;


Соответственно в конструкторе будет:
Код: java
1.
IzhikevichSim(Object nrn, int t, double dt) {



Вообще в Java, как и в ее предках C++ и Pascal/Delphi, используется статическая типизация. Т.е. у каждой переменной должен указываться тип, и допустимо использовать только те операции, методы и поля, которые определены для этого типа. Например, есть класс Point , определенный так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
public class Point {
  public int x;
  public int y;
  public Point(int x, int y) {
    this.x = x;
    this.y = y;
  }
}


И есть класс Point3D , который унаследован от него:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
public class Point3D {
  public int z;
  public Point3D(int x, int y, int z) {
    this.x = x;
    this.y = y;
    this.z = z;
  }
}


Тогда следующий код приведет к ошибке компиляции:
Код: java
1.
2.
Point p = new Point3D(1, 2, 3);
System.out.println(p.z);


Потому что у переменной p тип Point , а в нем поля z нет (хотя у созданного объекта это поле есть). У тебя аналогично, в классе Object нет поля v , и писать neuron.v недопустимо. Еще пример:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
public class Program {
  private static Object x;
  private static Object y;
  public static void main(String[] args) {
    x = 2;
    y = 3;
    System.out.println(x * y);
  }
}


Вызовет ошибку компиляции, потому что в классе Object не определена операция умножения. А если вместо Object указать Integer , то все заработает.

В Python, как и в большинстве скриптовых языков, используется динамическая утиная типизация, т.е. тип для переменной не указывается, а наличие полей, методов и операций проверяется у объекта во время выполнения. Т.е. если переменная neuron содержит объект, у которого есть поле v , то можно писать neuron.v . В этом плане интересен подход C#, где используется тоже статическая типизация, но можно делать Python'овские вещи с помощью ключевого слова dynamic . В Java, увы, такой возможности не предусмотрели.
...
Рейтинг: 0 / 0
Помогите перевести с [Python] на [Java]
    #38950627
Семён Антонович Сосницкий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще пару замечаний.
1. Классы IzhikevichNeuron и IzhikevichSim лучше поместить в разные .java-файлы.
2. Здесь
Код: python
1.
self.du = lambda a, b, v, u: a * (b * v - u)


Используются так называемые "лямбда-выражения" или анонимные функции. В Java 8 можно написать:
Код: java
1.
self.du = (int a, int b, int v, Integer u) -> {return a * (b * v - u);}


Предварительно нужно определить функциональный интерфейс:
Код: java
1.
2.
3.
4.
@FunctionalInterface
public interface Lambda4 {
   public int invoke(int a, int b, int v, Integer u);
}


И указать для поля du тип Lambda4 :
Код: java
1.
public Lambda4 du;


В Python анонимная функция вызывается как обычная, т.е. self.du(a, b, v, u) , в Java нужно вызывать определенный в функциональном интерфейсе метод, в данном случае invoke , т.е. this.du.invoke(a, b, v, u) . Разумеется, вместо Lamba4 и invoke можно использовать любые имена. В старых версиях Java то же самое делалось с помощью анонимных классов.
...
Рейтинг: 0 / 0
Помогите перевести с [Python] на [Java]
    #38950634
Семён Антонович Сосницкий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь
Код: python
1.
2.
self.t = t = numpy.arange(0, t + dt, dt)
self.stim = numpy.zeros(len(t))


создаются массивы, функция arange создает массив с элементами от 0 до t + dt , где каждый больше предыдущего на dt (т.е. 0, dt , dt + dt , dt + dt + dt , ..., t + dt ), а функция zeros создает массив из len(t) элементов и заполняет его нулями. В Java это можно сделать различными способами. Например, в первом случае можно создать список ArrayList<Integer> , поместить (метод add ) в него в цикле элементы от 0 до t + dt , а потом преобразовать (метод toArray ) в массив типа Integer[] . Во втором случае - просто создать массив и в цикле присвоить всем его элементам значение 0.
...
Рейтинг: 0 / 0
Помогите перевести с [Python] на [Java]
    #38950645
Sergeyyy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Семён Антонович Сосницкий, Огромное огромное вам спасибо!) Прям выручили!)

Спасибо за дополнительные разъяснения)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Помогите перевести с [Python] на [Java]
    #39366280
samo_soboy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Семён Антонович Сосницкий, если у Вас будет время - помогите перевести в java

Программа в файле 10.1.1)Заранее спасибо
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите перевести с [Python] на [Java]
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]