2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 [Wolfram Mathematica] Как написать процедуру?
Сообщение24.04.2015, 19:43 


22/04/14
7
Помогите, пожалуйста!
У меня есть код программы, который нужно поместить в процедуру.
аргумент процедуры должен быть функцией(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 
Заслуженный участник


25/02/11
1797
Скобки другие — {} для списков и двойные [[]] для элементов списка.
Код:
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 


22/04/14
7
Спасибо)

 Профиль  
                  
 
 Re: [Wolfram Mathematica] Как написать процедуру?
Сообщение24.04.2015, 21:12 
Заслуженный участник


27/04/09
28128
Если говорить вообще, функцию передать и «принять» проще простого. Принять:
Код:
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 


22/04/14
7
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 
Админ форума
Аватара пользователя


19/03/10
8952
 !  poisongirlala, замечание за капслок и избыточное цитирование.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group