2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 [Wolfram Mathematica] Как написать процедуру?
Сообщение24.04.2015, 19:43 
Помогите, пожалуйста!
У меня есть код программы, который нужно поместить в процедуру.
аргумент процедуры должен быть функцией(sin,cos,ln...)
Код:
(*Sin[x]*)data1 = Table[{x, Sin[x]}, {x, -1, 6, 0.1}];
(*ListPlot[data1];*)
data11 = data1[[;; , 2]];(*отримуємо набір ординат*)localmins1 =
Pick[data1, MinDetect[data11, 10^-6], 1];
localmaxs1 = Pick[data1, MaxDetect[data11, 10^-6], 1];
Graphics[{Thick, Blue, Line[data1], Red, PointSize[0.01],
   Point[localmins1], Point[localmaxs1]}, Axes -> True];

x1 = 1.6;
x2 = 4.7;
spx1 = {-1, 1.6, 4.7, 6};
spxrozb1 = {-1, -0.35, 0.3, 0.95, 1.6};
spxrozb2 = {1.6, 2.375, 3.15, 3.925, 4.7};
Graphics[{Thick, Blue, Line[data1], Red, PointSize[0.01],
  Point[localmins1], Point[localmaxs1],
  Point[{{-1, 0}, {1.6, 0}, {-0.35, 0}, {0.3, 0}, {0.95, 0}}], Green,
  Point[{{-0.35, -0.1342898}, {0.3, 0.29552}, {0.95, 0.813416}}], Red,
   Point[{{2.375, 0}, {3.15, 0}, {3.925, 0}, {4.7, 0}}], Green,
  Point[{{2.375, 0.693685}, {3.15, -0.0084}, {3.925, -0.70569766}}],
  Pink, Opacity[.7], EdgeForm[Directive[Dashed, Pink]],
  Rectangle[{-1, -0.84147}, {-0.35, -0.342898}],
  Rectangle[{-0.35, -0.342898}, {0.3, 0.29552}],
  Rectangle[{0.3, 0.29552}, {0.95, 0.813416}],
  Rectangle[{0.95, 0.813416}, {1.6`, 0.9995736030415051`}],
  Rectangle[{1.6, 0.99957}, {2.375, 0.693685}],
  Rectangle[{2.375, 0.693685}, {3.15, -0.0084}],
  Rectangle[{3.15, -0.0084}, {3.925, -0.70569766}],
  Rectangle[{3.925, -0.70569766}, {4.7, -0.9999}],}, Axes -> True]
(*Cos[x]*)
data2 = Table[{x, Cos[x]}, {x, -3, 4, 0.1}]; data22 =
data2[[;; , 2]];(*отримуємо набір ординат*)localmins2 =
Pick[data2, MinDetect[data22, 10^-6], 1];
localmaxs2 = Pick[data2, MaxDetect[data22, 10^-6], 1];
Graphics[{Thick, Blue, Line[data2], Red, PointSize[0.01],
   Point[localmins2], Point[localmaxs2]}, Axes -> True];
x11 = 0;
x22 = 3.1;
spx2 = {-3, 0, 3.1, 3};
spxrozb11 = {-3, -2.25, -1.5, -0.75, 0};
spxrozb22 = {0, 0.75, 1.5, 2.25, 3};
Graphics[{Thick, Blue, Line[data2], Red, PointSize[0.01],
  Point[localmins2], Point[localmaxs2],
  Point[{{-2.25, 0}, {-1.5, 0}, {-0.75, 0}, {0, 0}}], Green,
  Point[{{-2.25, -0.628}, {-1.5, 0.07}, {-0.75, 0.73}}], Red,
  Point[{{0.75, 0}, {1.5, 0}, {2.25, 0}, {3, 0}}], Green,
  Point[{{0.75, 0.7316}, {1.5, 0.07}, {2.25, -0.628}}], Pink,
  Opacity[.7], EdgeForm[Directive[Dashed, Pink]],
  Rectangle[{-3, -0.989992}, {-2.25, -0.628}],
  Rectangle[{-2.25, -0.628}, {-1.5, 0.07}],
  Rectangle[{-1.5, 0.07}, {-0.75, 0.7316}],
  Rectangle[{-0.75, 0.7316}, {1.6653345369377348`*^-16, 1.`}],
  Rectangle[{1.6653345369377348`*^-16, 1.`}, {0.75, 0.7316}],
  Rectangle[{0.75, 0.7316}, {1.5, 0.07}],
  Rectangle[{1.5, 0.07}, {2.25, -0.628}],
  Rectangle[{2.25, -0.628}, {3.1000000000000005`, \
-0.9991351502732795`}]}, Axes -> True]



я начала, но сразу же появились ошибки:(
Код:
f1 = Table[{x, Sin[x]}, {x, -1, 6, 0.1}];
f2 = Table[{x, Cos[x]}, {x, -3, 4, 0.1}];
data = [f1, f2];
graph[i_] := Graphics[{Thick, Blue, Line[data[i]]}, Axes -> True]
graph[1]

 
 
 
 Re: [Wolfram Mathematica] Как написать процедуру?
Сообщение24.04.2015, 20:28 
Скобки другие — {} для списков и двойные [[]] для элементов списка.
Код:
f1 = Table[{x, Sin[x]}, {x, -1, 6, 0.1}];
f2 = Table[{x, Cos[x]}, {x, -3, 4, 0.1}];
data = {f1, f2};
graph[i_] := Graphics[{Thick, Blue, Line[data[[i]]]}, Axes -> True]
graph[1]

 
 
 
 Re: [Wolfram Mathematica] Как написать процедуру?
Сообщение24.04.2015, 20:40 
Спасибо)

 
 
 
 Re: [Wolfram Mathematica] Как написать процедуру?
Сообщение24.04.2015, 21:12 
Если говорить вообще, функцию передать и «принять» проще простого. Принять:
Код:
ourGenericFunction[value_, function_] := function[value]
Наша ourGenericFunction принимает два аргумента, второй из которых function — функция. Это не нужно как-нибудь помечать для Mathematica — просто себе помнить, что функция — второй аргумент.

Возвращается же здесь значение переданной функции от переданного первым аргументом чего-нибудь. Например,
Код:
In>  ourGenericFunction[4, Sqrt]
Out> 2
In>  ourGenericFunction[Pi/3, Cos]
Out> 1/2
In>  ourGenericFunction[-42, Positive]
Out> False
Вот так функция и передаётся, если у неё есть имя. Безымянную функцию можно точно так же передавать:
Код:
In>  ourGenericFunction[12, #^2 &]
Out> 144
In>  ourGenericFunction[12, Function[t, t^2]]
Out> 144

Тогда если абстрагировать те два первые куска с data1 и data2, придётся ещё использовать Block, чтобы объединить все операторы внутри одной функции и заодно спрятать локальные переменные. Будет что-то такое (не проверял работу, просто механически переписал):
Код:
operation[f_] := Block[
  {data, data1, localmins, localmaxs, x1, x2, spxrozb1, spxrozb2},
  data = Table[{x, f[x]}, {x, -1, 6, 0.1}];
  data1 = data[[;; , 2]];(*отримуємо набір ординат*)
  localmins = Pick[data, MinDetect[data1, 10^-6], 1];
  localmaxs = Pick[data, MaxDetect[data1, 10^-6], 1];
  x1 = 1.6;
  x2 = 4.7;
  spx = {-1, 1.6, 4.7, 6};
  spxrozb1 = {-1, -0.35, 0.3, 0.95, 1.6};
  spxrozb2 = {1.6, 2.375, 3.15, 3.925, 4.7};
  Graphics[{Thick, Blue, Line[data], Red, PointSize[0.01],
    Point[localmins], Point[localmaxs],
    Point[{{-1, 0}, {1.6, 0}, {-0.35, 0}, {0.3, 0}, {0.95, 0}}], Green,
    Point[{{-0.35, -0.1342898}, {0.3, 0.29552}, {0.95, 0.813416}}], Red,
    Point[{{2.375, 0}, {3.15, 0}, {3.925, 0}, {4.7, 0}}], Green,
    Point[{{2.375, 0.693685}, {3.15, -0.0084}, {3.925, -0.70569766}}],
    Pink, Opacity[.7], EdgeForm[Directive[Dashed, Pink]],
    Rectangle[{-1, -0.84147}, {-0.35, -0.342898}],
    Rectangle[{-0.35, -0.342898}, {0.3, 0.29552}],
    Rectangle[{0.3, 0.29552}, {0.95, 0.813416}],
    Rectangle[{0.95, 0.813416}, {1.6`, 0.9995736030415051`}],
    Rectangle[{1.6, 0.99957}, {2.375, 0.693685}],
    Rectangle[{2.375, 0.693685}, {3.15, -0.0084}],
    Rectangle[{3.15, -0.0084}, {3.925, -0.70569766}],
    Rectangle[{3.925, -0.70569766}, {4.7, -0.9999}],}, Axes -> True]
]

(* и выполним всё это от каждой функции! *)
operation[Sin]
operation[Cos]

 
 
 
 Re: [Wolfram Mathematica] Как написать процедуру?
Сообщение25.04.2015, 12:06 
arseniiv в сообщении #1007679 писал(а):
Если говорить вообще, функцию передать и «принять» проще простого. Принять:
Код:
ourGenericFunction[value_, function_] := function[value]
Наша ourGenericFunction принимает два аргумента, второй из которых function — функция. Это не нужно как-нибудь помечать для Mathematica — просто себе помнить, что функция — второй аргумент.

Возвращается же здесь значение переданной функции от переданного первым аргументом чего-нибудь. Например,
Код:
In>  ourGenericFunction[4, Sqrt]
Out> 2
In>  ourGenericFunction[Pi/3, Cos]
Out> 1/2
In>  ourGenericFunction[-42, Positive]
Out> False
Вот так функция и передаётся, если у неё есть имя. Безымянную функцию можно точно так же передавать:
Код:
In>  ourGenericFunction[12, #^2 &]
Out> 144
In>  ourGenericFunction[12, Function[t, t^2]]
Out> 144

Тогда если абстрагировать те два первые куска с data1 и data2, придётся ещё использовать Block, чтобы объединить все операторы внутри одной функции и заодно спрятать локальные переменные. Будет что-то такое (не проверял работу, просто механически переписал):
Код:
operation[f_] := Block[
  {data, data1, localmins, localmaxs, x1, x2, spxrozb1, spxrozb2},
  data = Table[{x, f[x]}, {x, -1, 6, 0.1}];
  data1 = data[[;; , 2]];(*отримуємо набір ординат*)
  localmins = Pick[data, MinDetect[data1, 10^-6], 1];
  localmaxs = Pick[data, MaxDetect[data1, 10^-6], 1];
  x1 = 1.6;
  x2 = 4.7;
  spx = {-1, 1.6, 4.7, 6};
  spxrozb1 = {-1, -0.35, 0.3, 0.95, 1.6};
  spxrozb2 = {1.6, 2.375, 3.15, 3.925, 4.7};
  Graphics[{Thick, Blue, Line[data], Red, PointSize[0.01],
    Point[localmins], Point[localmaxs],
    Point[{{-1, 0}, {1.6, 0}, {-0.35, 0}, {0.3, 0}, {0.95, 0}}], Green,
    Point[{{-0.35, -0.1342898}, {0.3, 0.29552}, {0.95, 0.813416}}], Red,
    Point[{{2.375, 0}, {3.15, 0}, {3.925, 0}, {4.7, 0}}], Green,
    Point[{{2.375, 0.693685}, {3.15, -0.0084}, {3.925, -0.70569766}}],
    Pink, Opacity[.7], EdgeForm[Directive[Dashed, Pink]],
    Rectangle[{-1, -0.84147}, {-0.35, -0.342898}],
    Rectangle[{-0.35, -0.342898}, {0.3, 0.29552}],
    Rectangle[{0.3, 0.29552}, {0.95, 0.813416}],
    Rectangle[{0.95, 0.813416}, {1.6`, 0.9995736030415051`}],
    Rectangle[{1.6, 0.99957}, {2.375, 0.693685}],
    Rectangle[{2.375, 0.693685}, {3.15, -0.0084}],
    Rectangle[{3.15, -0.0084}, {3.925, -0.70569766}],
    Rectangle[{3.925, -0.70569766}, {4.7, -0.9999}],}, Axes -> True]
]

(* и выполним всё это от каждой функции! *)
operation[Sin]
operation[Cos]




СПАСИБО БОЛЬШОЕ!!!

 
 
 
 Re: [Wolfram Mathematica] Как написать процедуру?
Сообщение26.04.2015, 00:08 
Аватара пользователя
 !  poisongirlala, замечание за капслок и избыточное цитирование.

 
 
 [ Сообщений: 6 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group