python -> scilab ошибка перевода - PullRequest
0 голосов
/ 27 июня 2018

Мой scilab не отображает ничего, касающегося моей попытки перенести проблему "Oscillateurs mécanique coupls" с python на scilab, но он должен отображать 3 графика, представляющих колебания

Вот этот питон:

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint
m1=1;m2=1;k1=1;k2=1;k3=1;m=1;k=1;a=1;
def equadiff(var,t):
    x1=var[0]
    x2=var[1]
    v1=var[2]
    v2=var[3]
    a1=( k2*x2-(k1+k2)*x1)/m1
    a2=( k2*x1-(k2+k3)*x2)/m2
    return ([v1,v2,a1,a2])
def Oscillateur(x10,x20,v10,v20,tmax):
    t=np.linspace(0,tmax,300)
    fig = plt.figure()
    ax = fig.add_subplot(1,1,1,aspect="equal")
    ax.spines["left"].set_position("zero")
    ax.spines["right"].set_color("none")
    ax.spines["bottom"].set_position("zero")
    ax.spines["top"].set_color("none")
    ax.xaxis.set_ticks_position("bottom")
    ax.yaxis.set_ticks_position("left")
    plt.axis("tight")
    var0=[x10,x20,v10,v20]
    solution=odeint(equadiff,var0,t)
    x1=solution[:,0]
    x2=solution[:,1]
    v1=solution[:,2]
    v2=solution[:,3]
    plt.plot(t,x1,t,x2)
    plt.axis("tight")
    plt.show()
Oscillateur(a,a,0,0,10)
Oscillateur(a,-a,0,0,10)
Oscillateur(2*a,0,0,0,50)

Вот мой scilab, проблема находится в этом коде, я думаю, это будут ax.yaxis.set_ticks_position ("left"), но я не могу понять, как решить эту проблему и отобразить мой график:

m1=1;m2=1;k1=1;k2=1;k3=1;m=1;k=1;a=1;

function S=equadiff(var,t)
    x1=var(0)
    x2=var(1)
    v1=var(2)
    v2=var(3)
    a1=(k2*x2-(k1+k2)*x1)/m1
    a2=(k2*x1-(k2+k3)*x2)/m2
    disp([v1,v2,a1,a2])
endfunction

function T=Oscillateur(x10,x20,v10,v20,tmax)
  t=linspace(0,tmax,300)
  figure()
  ax=subplot(1,1,1,aspect="equal")
  var0=[x10,x20,v10,v20]
  solution=ode(var0,t0,t,equadiff)
  x1=solution(:,0)
  x2=solution(:,1)
  v1=solution(:,2)
  v2=solution(:,3)
  plot(t,x1,t,x2)
  a=gca()
  a.x_location = "zero";
  axis("tight");
endfunction 

disp(Oscillateur(a,a,0,0,10)) 
disp(Oscillateur(a,-a,0,0,10))
disp(Oscillateur(2*a,0,0,0,50))

1 Ответ

0 голосов
/ 02 июля 2018

Здесь много ошибок:

  1. equadiff возвращает S, который не объявлен.
  2. индексация Scilab начинается с 1
  3. subplot не имеет аргумента с именем "аспект".
  4. t0 не определено.
  5. equadiff аргументы должны быть t,var в таком порядке.
  6. x аргумент должен быть вектором столбца, если t - вектор строки.
  7. Oscillateur возвращает T, который не объявлен.
  8. disp не может вернуть этот пустой возврат.
  9. x_location свойство не существует для дескриптора осей

Исправление всех ошибок тезисов дает вам:

m1=1;m2=1;
k1=1;k2=1;k3=1;
m=1;
k=1;
a=1;

// added k1,k2,k3 m1,m2 as argument
function S=equadiff(t,x,k1,k2,k3,m1,m2)
    x1=x(1)
    x2=x(2)
    v1=x(3)
    v2=x(4)
    a1=(k2*x2-(k1+k2)*x1)/m1
    a2=(k2*x1-(k2+k3)*x2)/m2
    S=[v1;v2;a1;a2] // now equadiff returns an 4 by 1 vector
endfunction

// added k1,k2,k3 m1,m2 as argument
// Removed T as not used
function Oscillateur(x10,x20,v10,v20,tmax,equadiff,k1,k2,k3,m1,m2)
  t=linspace(0,tmax,300)
  figure()
  var0=[x10;x20;v10;v20] // x is 4 by 1 vector
  solution=ode(var0,0,t,list(equadiff,k1,k2,k3,m1,m2)) // k1 ,etc ar now passed as additionnal argument for equadiff
  // since equadiff returns a 4 by 1 vector and t is 1 by 300
  // solution is 4 by 300
  x1=solution(1,:)
  x2=solution(2,:)
  v1=solution(3,:)
  v2=solution(4,:)
  plot(t,x1,t,x2)
  legend('x1','x2')
  a=gca()
  //a.x_location = "zero"; //  what was that for ?
  set(a,"tight_limits","on");
endfunction 

// Display is only for printing value.
Oscillateur(a,a,0,0,10,equadiff,k1,k2,k3,k1,m2)
Oscillateur(a,-a,0,0,10,equadiff,k1,k2,k3,k1,m2)
Oscillateur(2*a,0,0,0,50,equadiff,k1,k2,k3,k1,m2)
...