Построить график функции из массива точек

Форум пользователей пакета Maple

Модератор: Admin

csrnsdrfg1
Сообщения: 3
Зарегистрирован: Чт дек 21, 2017 10:49 pm

Построить график функции из массива точек

Сообщение csrnsdrfg1 » Чт дек 21, 2017 11:28 pm

Хочу построить график по точкам (x_i, f(x_i)). Чтобы точки автоматически соединились отрезками. Mapl'ом пользуюсь редко, так что сразу прощения за качество кода. Скажите, пожалуйста, где ошибка?

Код: Выделить всё

gamma1 := 2.5

f := proc (omega) options operator, arrow; 2*omega*(int(cos((omega^2-2/gamma1-1)*x)*BesselJ(0, x/gamma1), x = 0 .. 100, continuous))/Pi end proc

N := 1000
arr := matrx(N, 2)
for i to N do arr[i][1] := 2.0*i/N end do
for i to N do arr[i][2] := evalf(f(arr[i][1])) end do
plot([arr[i][1], arr[i][2], i = 1 .. N])


"Error, (in plot) incorrect first argument [arr[11][1], arr[11][2], 11 = 1 .. 10]"

Markiyan Hirnyk
Сообщения: 1221
Зарегистрирован: Вс дек 04, 2011 11:07 pm

Re: Построить график функции из массива точек

Сообщение Markiyan Hirnyk » Пт дек 22, 2017 11:45 pm

Вот исправленный код

Код: Выделить всё

gamma1 := 2.5:
 f := proc (omega) options operator, arrow; 2*omega*(int(cos((omega^2-2/gamma1-1)*x)*BesselJ(0, x/gamma1), x = 0 .. 100))/Pi end proc;
  N := 1000:
   arr := Matrix(N, 2); for i to N do arr[i, 1] := 2.0*i/N end do:
    for i to N do arr[i, 2] := evalf(f(arr[i, 1])) end do:
    plot(arr);

, работающий в Мэйпле 2017.3.

Kitonum
Сообщения: 2040
Зарегистрирован: Ср дек 31, 2008 1:55 pm
Откуда: г. Пенза

Re: Построить график функции из массива точек

Сообщение Kitonum » Сб дек 23, 2017 9:08 am

То же самое можно написать короче и без циклов, если использовать команду seq и обычные списки:
restart;
gamma1 := 2.5: N:=1000:
f := omega->2*omega*(Int(cos((omega^2-2/gamma1-1)*x)*BesselJ(0, x/gamma1), x = 0 .. 100))/Pi;
arr:=[seq([2*i/N,evalf(f(2*i/N))], i=1..N)]:
plot(arr);

Markiyan Hirnyk
Сообщения: 1221
Зарегистрирован: Вс дек 04, 2011 11:07 pm

Re: Построить график функции из массива точек

Сообщение Markiyan Hirnyk » Сб дек 23, 2017 12:21 pm

Выполнение кода ускоряет замена int на Int. Использование seq ускоряет его несущественно:

Код: Выделить всё

restart; s := time(); gamma1 := 2.5; f := proc (omega) options operator, arrow; 2*omega*(Int(cos((omega^2-2/gamma1-1)*x)*BesselJ(0, x/gamma1), x = 0 .. 100))/Pi end proc; N := 1000; arr := Matrix(N, 2); for i to N do arr[i, 1] := 2.0*i/N end do; for i to N do arr[i, 2] := evalf(f(arr[i, 1])) end do; plot(arr); time()-s;
17.407
 restart; s := time(); gamma1 := 2.5; N := 1000; f := proc (omega) options operator, arrow; 2*omega*(Int(cos((omega^2-2/gamma1-1)*x)*BesselJ(0, x/gamma1), x = 0 .. 100))/Pi end proc; arr := [seq([2*i/N, evalf(f(2*i/N))], i = 1 .. N)]; plot(arr); time()-s;
17.906