<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/css" href="http://wiki2.linuxformat.ru/skins/common/feed.css?97"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
	<channel>
		<title>LXF107:SciLab - История изменений</title>
		<link>http://wiki2.linuxformat.ru/index.php?title=LXF107:SciLab&amp;action=history</link>
		<description>История изменений этой страницы в вики</description>
		<language>ru</language>
		<generator>MediaWiki 1.11.1</generator>
		<lastBuildDate>Wed, 13 May 2026 20:54:04 GMT</lastBuildDate>
		<item>
			<title>Yaleks: /* Отладка */</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF107:SciLab&amp;diff=8524&amp;oldid=prev</link>
			<description>&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Отладка&lt;/span&gt;&lt;/p&gt;

			&lt;table style=&quot;background-color: white; color:black;&quot;&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;col class='diff-marker' /&gt;
			&lt;col class='diff-content' /&gt;
			&lt;tr&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
				&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 13:20, 24 августа 2009&lt;/td&gt;
			&lt;/tr&gt;
		&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 308:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 308:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Конечно же, рамки статьи не позволяют мне описать все, что хотелось бы, особенно это касается программирования. Но я надеюсь, что&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Конечно же, рамки статьи не позволяют мне описать все, что хотелось бы, особенно это касается программирования. Но я надеюсь, что&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;-&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;данная статья даст вам некоторое представление о возможностях и принципах работы ''SciLab'' с функциями. Если вас заинтересовала эта тема, напишите нам на &lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;{&lt;/del&gt;mailto:letters@linuxformat.ru letters@linuxformat.&lt;del style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;ruЪ &lt;/del&gt;– возможно, мы выпустим несколько уроков по программированию в ''SciLab''. '''LXF'''&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;данная статья даст вам некоторое представление о возможностях и принципах работы ''SciLab'' с функциями. Если вас заинтересовала эта тема, напишите нам на &lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;[&lt;/ins&gt;mailto:letters@linuxformat.ru letters@linuxformat.&lt;ins style=&quot;color: red; font-weight: bold; text-decoration: none;&quot;&gt;ru] &lt;/ins&gt;– возможно, мы выпустим несколько уроков по программированию в ''SciLab''. '''LXF'''&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;===Форматируем график===&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;===Форматируем график===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</description>
			<pubDate>Mon, 24 Aug 2009 13:20:11 GMT</pubDate>			<dc:creator>Yaleks</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF107:SciLab</comments>		</item>
		<item>
			<title>Crazy Rebel: викификация, оформление, иллюстрация, формула</title>
			<link>http://wiki2.linuxformat.ru/index.php?title=LXF107:SciLab&amp;diff=8513&amp;oldid=prev</link>
			<description>&lt;p&gt;викификация, оформление, иллюстрация, формула&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая статья&lt;/b&gt;&lt;/p&gt;&lt;div&gt;: '''''SciLab''''' Лаборатория численных расчетов, открытая для всех желающих&lt;br /&gt;
&lt;br /&gt;
[[Категория:Учебники]]{{Цикл/SciLab}}&lt;br /&gt;
&lt;br /&gt;
==Функции: встроенные и внешние==&lt;br /&gt;
&lt;br /&gt;
: '''ЧАСТЬ 2''' Какая же математика без функций? '''Александр Бикмеев''' покажет, что может предложить здесь ''SciLab'', на примере задачи о теле, брошенном под углом к горизонту.&lt;br /&gt;
&lt;br /&gt;
На прошлом занятии мы узнали, что такое ''SciLab'', поработали с матрицами, решили систему уравнений и построили графики. Теперь настало время копнуть чуть глубже, ведь все эти действия можно выполнить и в ''OOo Calc''.&lt;br /&gt;
&lt;br /&gt;
===Inline-функции===&lt;br /&gt;
&lt;br /&gt;
''SciLab'' имеет большую библиотеку встроенных функций, однако&lt;br /&gt;
вряд ли разработчики включили в нее ту самую, которую необходимо проанализировать вам: например, описывающую перемещение тела, брошенного под углом к горизонту. Ею мы и займемся на данном уроке. Пусть движение тела по оси '''Oy''' описывает изменение&lt;br /&gt;
высоты над поверхностью земли, а по оси '''Ox''' – дальность полета.&lt;br /&gt;
Соответствующие функции имеют вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;h(t)=h_0 + v_0 sin(\alpha) t - \frac{gt^2}{2}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;s(t)=s_0 + v_0 cos(\alpha) t \frac{}{}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
где – &amp;lt;math&amp;gt;v_0&amp;lt;/math&amp;gt; модуль вектора начальной скорости, &amp;lt;math&amp;gt;h_0&amp;lt;/math&amp;gt; и &amp;lt;math&amp;gt;s_0&amp;lt;/math&amp;gt; – начальная высота и смещение от точек отсчета по вертикали и горизонтали, соответственно, – α угол между вектором начальной скорости и горизонтом.&lt;br /&gt;
&lt;br /&gt;
Эти функции довольно просты, поэтому можно, конечно, вводить&lt;br /&gt;
их в виде отдельных выражений всякий раз, когда это потребуется.&lt;br /&gt;
Мы, однако, пойдем другим путем и запишем их в виде так называемых inline-функций, т.е. функций, описываемых в одну команду.&lt;br /&gt;
&lt;br /&gt;
Пусть тело сброшено с высоты 2 км. Вот как можно узнать, на&lt;br /&gt;
какой высоте оно окажется спустя 5, 10, 15 и 20 секунд.&lt;br /&gt;
&lt;br /&gt;
 --&amp;gt;deff('[y]=h(t)','y=h0+v0*sin(alpha)*t-g*t^2/2');&lt;br /&gt;
 --&amp;gt;deff('[x]=s(t)','x=s0+v0*cos(alpha)*t');&lt;br /&gt;
 --&amp;gt;h0=2000;alpha=(-90*%pi/180);v0=0;g=9.81;&lt;br /&gt;
 --&amp;gt;t=[5,10,15,20];&lt;br /&gt;
 --&amp;gt;h(t)&lt;br /&gt;
  ans =&lt;br /&gt;
   1877.375 1509.5 896.375 38.&lt;br /&gt;
&lt;br /&gt;
Значение угла (&amp;lt;math&amp;gt;-90^o&amp;lt;/math&amp;gt;) необходимо перевести в радианы: ''SciLab'',&lt;br /&gt;
как и многие системы, использует именно их. Если вы твердо хотите&lt;br /&gt;
работать с градусами, то можете переопределить ''h(t)'' и ''s(t)'' следующим образом:&lt;br /&gt;
&lt;br /&gt;
 --&amp;gt;deff('[y]=h(t)','y=h0+v0*sin(alpha*%pi/180)*t-g*t^2/2');&lt;br /&gt;
 --&amp;gt;deff('[x]=s(t)','x=s0+v0*cos(alpha*%pi/180)*t');&lt;br /&gt;
&lt;br /&gt;
Поскольку любая функция – это, практически, переменная, то&lt;br /&gt;
и вычисляться она будет в соответствии с описанием, заданным&lt;br /&gt;
последним. Однако мы далее будем работать с радианами, то есть с&lt;br /&gt;
первой версией функций.&lt;br /&gt;
&lt;br /&gt;
Подобным образом можно описать любые некусочно заданные&lt;br /&gt;
функции. Общий вид таков:&lt;br /&gt;
&lt;br /&gt;
  deff('[&amp;lt;результат&amp;gt; = &amp;lt;имя функции&amp;gt;(&amp;lt;входные переменные&amp;gt;)]','&amp;lt;мат.описание функции&amp;gt;','ключ')&lt;br /&gt;
&lt;br /&gt;
Ключ – необязательный параметр, принимающий значения '''c''' или '''n'''. В первом случае функция будет скомпилирована, что повышает быстродействие, а во втором – нет; по умолчанию действует ключ&lt;br /&gt;
'''c'''. Однако не следует считать, что inline-функции годятся только для&lt;br /&gt;
простых случаев. Математическое описание функции, а также результат, могут представлять собой матрицу и содержать многошаговые&lt;br /&gt;
вычисления. Возьмем, например, функцию '''Qroots()''', решающую квадратные уравнения:&lt;br /&gt;
&lt;br /&gt;
  --&amp;gt;deff('[x1, x2]=Qroots(Qa,Qb,Qc)',['D=Qb^2-4*Qa*Qc';'x1=(-Qb+sqrt(D))/(2*Qa)';'x2=(-Qb-sqrt(D))/(2*Qa)']);&lt;br /&gt;
&lt;br /&gt;
Опробуем ее на нашем примере. Пусть начальная высота равна нулю, а скорость равна 20 м/с и направлена вверх (&amp;lt;math&amp;gt;90^o&amp;lt;/math&amp;gt;). Определим, когда тело окажется на высоте 20 м. Если ось '''Oy''' направлена вертикально вверх, то уравнение будет иметь вид:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;20 - 20t + \frac {9,81t^2}{2} = 0&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Найдем его корни при помощи '''Qroots''':&lt;br /&gt;
&lt;br /&gt;
  --&amp;gt;[h1,h2] = Qroots(9.81/2,-20,20)&lt;br /&gt;
   h2 =&lt;br /&gt;
      1.7577156&lt;br /&gt;
   h1 =&lt;br /&gt;
      2.3197563&lt;br /&gt;
&lt;br /&gt;
Решим уравнение с другими коэффициентами:&lt;br /&gt;
&lt;br /&gt;
  --&amp;gt;[q1,q2]=Qroots(1,2,3)&lt;br /&gt;
  q2 =&lt;br /&gt;
    - 1. - 1.4142136i&lt;br /&gt;
  q1 =&lt;br /&gt;
    - 1. + 1.4142136i&lt;br /&gt;
&lt;br /&gt;
Как видно из этого примера, в тексте описания функции можно&lt;br /&gt;
создавать внутренние переменные. И кроме того, нам не пришлось&lt;br /&gt;
обрабатывать случай отрицательного дискриминанта, поскольку&lt;br /&gt;
''SciLab'' понимает мнимые числа и умеет работать с ними. Впрочем, он&lt;br /&gt;
также умеет решать алгебраические и трансцендентные уравнения и&lt;br /&gt;
без нашей помощи, так что вернемся к примеру с бросанием.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение: LXF107_81_1.jpg|Рис. 1.|300px]]Рис. 1. Траектория движения тела, брошенного под углом к горизонту и... ушедшего в недра земли.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Давайте построим траекторию полета тела в течение первых 10 секунд при начальной скорости 20 м/с и угле &amp;lt;math&amp;gt;90^o&amp;lt;/math&amp;gt;, считая,&lt;br /&gt;
что &amp;lt;math&amp;gt;h_0 = s_0 = 0&amp;lt;/math&amp;gt;. Для этого нам необходимо создать вектор значений&lt;br /&gt;
времени '''(t)''', а затем построить график, где по оси '''Ox''' будет отложена&lt;br /&gt;
'''s(t)''', а по оси '''Oy''' – '''h(t)''':&lt;br /&gt;
&lt;br /&gt;
 --&amp;gt;h0=0;s0=0;alpha=(45*%pi/180);v0=20;g=9.81;&lt;br /&gt;
 --&amp;gt;t=0:0.1:10;&lt;br /&gt;
 --&amp;gt;plot(s(t),h(t),'r-')&lt;br /&gt;
&lt;br /&gt;
В результате мы получили траекторию полета тела, которая представляет собой график функции '''h(s)''', заданной параметрически. Прочитавшие наш урок в [[LXF106:SciLab|LXF106]], вероятно, обратят внимание на добавку '''r-''' в вызове '''plot()'''. Это специальный параметр, регулирующий оформление. Видите, линия на рис. 1 не черная, а красная?&lt;br /&gt;
Остальные значения приведены во врезке Форматируем график.&lt;br /&gt;
&lt;br /&gt;
Итак, наше тело ушло в недра земли. Чтобы этого не случилось,&lt;br /&gt;
мы должны грамотно задавать диапазон расчета, т.е. определить, где&lt;br /&gt;
высота становится равной нулю. Элегантное решение мы разработаем чуть позднее, а пока воспользуемся встроенными средствами.&lt;br /&gt;
&lt;br /&gt;
Функция '''fsolve''' позволяет решать линейные и нелинейные уравнения, а также их системы, заданные функциями, то есть находить нули функций. Поскольку ищется численное, а не аналитическое решение,&lt;br /&gt;
то в результате мы получим одно число. Однако какое решение мы&lt;br /&gt;
найдем, зависит от значения начального приближения. Так происходит&lt;br /&gt;
потому, что, как правило, методы численного решения алгебраических&lt;br /&gt;
уравнений позволяют найти ближайший к указанной точке корень.&lt;br /&gt;
&lt;br /&gt;
Общий вид вызова функции таков:&lt;br /&gt;
&lt;br /&gt;
 eqAns = fsolve(vInit,F,Fj,e)&lt;br /&gt;
&lt;br /&gt;
где '''eqAns''' – это переменная или вектор решений, '''vInit''' – начальное&lt;br /&gt;
значение или вектор начальных значений, '''F''' – функция или список&lt;br /&gt;
функций, представляющих собой левые части уравнений, '''Fj''' – это производная или список производных функций '''F, e''' – точность. Последние два параметра необязательны.&lt;br /&gt;
&lt;br /&gt;
Чтобы корректно построить траекторию, нам необходимо найти нетривиальный положительный корень уравнения '''h(t) = 0'''. Зададим&lt;br /&gt;
начальное приближение, равное '''5'''.&lt;br /&gt;
&lt;br /&gt;
 --&amp;gt;t_end=fsolve(5,h)&lt;br /&gt;
  t_end =&lt;br /&gt;
    2.8832081&lt;br /&gt;
 --&amp;gt;t=0:0.01:t_end;&lt;br /&gt;
 --&amp;gt;plot(s(t),h(t),'r-')&lt;br /&gt;
&lt;br /&gt;
Выполните эти команды самостоятельно и посмотрите результат.&lt;br /&gt;
&lt;br /&gt;
===Полиномы===&lt;br /&gt;
&lt;br /&gt;
Конечно, искать корни по одному – это неплохо, но как быть, если необходимо узнать их оба сразу? Здесь поможет другой подход, не&lt;br /&gt;
использующий inline-функций. Если внимательно посмотреть на '''h(t)''',&lt;br /&gt;
то можно заметить, что она представляет собой полином второй степени относительно '''t'''. В ''SciLab'' встроено достаточно инструментов для работы с полиномами – в частности, есть функция '''root''', возвращающая их корни.&lt;br /&gt;
&lt;br /&gt;
Перед использованием полином необходимо определить. Делается это при помощи функции '''poly'''. Ее первый аргумент – это&lt;br /&gt;
вектор-строка коэффициентов или корней полинома (смысл определяется флагом), второй – символьная переменная, а третий – флаг,&lt;br /&gt;
принимающий значения '''roots''' или '''coeff'''. Например, пусть нам известно, что начальная высота полета равна 10 м, начальная скорость – 10 м/с и угол равен &amp;lt;math&amp;gt;300^o&amp;lt;/math&amp;gt;. Требуется записать закон изменения высоты со&lt;br /&gt;
временем.&lt;br /&gt;
&lt;br /&gt;
 --&amp;gt;hCoeff = [10, 10*sin(30*%pi/180),-9.81/2];&lt;br /&gt;
 --&amp;gt;h=poly(hCoeff,'t','coeff')&lt;br /&gt;
  h=&lt;br /&gt;
  10 + 5t - 4.905t2&lt;br /&gt;
&lt;br /&gt;
Здесь мы указали флаг '''coeff''', сообщающий, что первый параметр – это вектор коэффициентов полинома. А теперь определим,&lt;br /&gt;
сколько секунд тело уже находится в полете и когда оно упадет на землю.&lt;br /&gt;
&lt;br /&gt;
 --&amp;gt;roots(h)&lt;br /&gt;
  ans =&lt;br /&gt;
   - 1.006401&lt;br /&gt;
     2.025769&lt;br /&gt;
&lt;br /&gt;
То есть тело было брошено примерно секунду назад и упадет примерно через две секунды.&lt;br /&gt;
&lt;br /&gt;
Теперь попробуем пойти другим путем. Известно, что тело находится в полете 3 секунды и через 5 секунд упадет на землю.&lt;br /&gt;
Определить закон изменения высоты.&lt;br /&gt;
&lt;br /&gt;
 --&amp;gt;hRoots = [-3,5];&lt;br /&gt;
 --&amp;gt;h=poly(hRoots,'t','roots')*(-9.81)/2&lt;br /&gt;
  h=&lt;br /&gt;
     73.575 + 9.81t – 4.905t2&lt;br /&gt;
&lt;br /&gt;
Таким образом, в настоящий момент времени тело находится на&lt;br /&gt;
высоте 73,5 метра и имеет вертикальную скорость, равную 9,81 м/с.&lt;br /&gt;
В данном случае флаг '''roots''' (используется по умолчанию) означает, что первый параметр – это корни полинома, который следует&lt;br /&gt;
сформировать.&lt;br /&gt;
&lt;br /&gt;
Естественно, работа с полиномами не ограничивается этими&lt;br /&gt;
двумя функциями. В версии 4.1.2 их насчитывается более 35, среди которых нахождение эрмитовой формы ('''hermit'''), полиномиальное деление ('''pdiv'''), рациональное упрощение ('''simp''') и многое другое – посмотрите раздел ''Polinomial calculations'' в справке. Кроме того, с полиномами можно работать так же, как с обычными переменными, то есть вычитать, умножать, возводить в степень и т.д. при помощи символов обычных арифметических действий. Например, определим два полинома, а затем выполним с ними все четыре арифметических действия, а также возведем один из&lt;br /&gt;
них в квадрат.&lt;br /&gt;
&lt;br /&gt;
  --&amp;gt;p1=poly([27,0,0,-8],'s','coeff')&lt;br /&gt;
  p1 =&lt;br /&gt;
     27 - 8s3&lt;br /&gt;
 --&amp;gt;p2=poly([9,6,4],'s','coeff')&lt;br /&gt;
  p2 =&lt;br /&gt;
     9 + 6s + 4s2&lt;br /&gt;
 --&amp;gt;p_add=p1+p2&lt;br /&gt;
  p_add =&lt;br /&gt;
     36 + 6s + 4s2 - 8s3&lt;br /&gt;
 --&amp;gt;p_decr=p1-p2&lt;br /&gt;
  p_decr =&lt;br /&gt;
     18 - 6s - 4s2 - 8s3&lt;br /&gt;
 --&amp;gt;p_div=p1/p2&lt;br /&gt;
  p_div =&lt;br /&gt;
     3 - 2s&lt;br /&gt;
     ------&lt;br /&gt;
     1&lt;br /&gt;
 --&amp;gt;p_mult=p1*p2&lt;br /&gt;
  p_mult =&lt;br /&gt;
    243 + 162s + 108s2 - 72s3 - 48s4 - 32s5&lt;br /&gt;
 --&amp;gt;p_degr=p2^2&lt;br /&gt;
  p_degr =&lt;br /&gt;
    81 + 108s + 108s2 + 48s3 + 16s4&lt;br /&gt;
&lt;br /&gt;
===Внешние функции===&lt;br /&gt;
&lt;br /&gt;
Да, возможности ''SciLab'' достаточно обширны, хотя их пока все-таки&lt;br /&gt;
нельзя сравнивать с функционалом ''Matlab''; и все же у этих двух программ есть нечто общее – их часто называют системами разработки высокотехнологичных приложений. А это значит, что у ''SciLab'' (как и&lt;br /&gt;
''MatLab'') есть встроенный язык программирования. На самом деле,&lt;br /&gt;
все функции, которые мы использовали, также входят в этот язык,&lt;br /&gt;
наряду с обычными конструкциями (условие, цикл) и возможностями использования графики. Следовательно, программист, работая в&lt;br /&gt;
''SciLab'', может не отвлекаться на реализацию численных методов, а&lt;br /&gt;
использовать уже готовые наработки.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение: LXF107_82_1.jpg|Рис. 2.|300px]]Рис. 2. Встроенный редактор ''SciPad'' с текстом нашей функции.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Как и любая среда разработки, ''SciLab'' обладает текстовым редактором с подсветкой синтаксиса – ''SciPad''. Вызывается он выбором пункта меню '''Editor''' или командой ''editor''. Редактор, в отличие от оболочки&lt;br /&gt;
''SciLab'', способен отображать комментарии, набранные кириллицей,&lt;br /&gt;
однако русского интерфейса не имеет. Вот здесь вы и можете поучаствовать в проекте, поскольку перевод выполняется достаточно просто, а файл не так уж велик. Описание того, как сделать перевод, можно&lt;br /&gt;
вызвать из ''SciPad'' ('''Help &amp;gt; Adding translation...''') Желающие – вперед!&lt;br /&gt;
&lt;br /&gt;
Интерфейс предельно прост: строка текстового меню, а под ней&lt;br /&gt;
рабочая область. Вот в меню-то и сосредоточена вся сила ''SciPad'';&lt;br /&gt;
кроме того, почти все его команды имеют «горячие» клавиши.&lt;br /&gt;
Пункты меню достаточно стандартны, но хочется отметить, что этот&lt;br /&gt;
редактор имеет средства отладки (пункт меню '''Debug'''), настраиваемую подсветку синтаксиса, проверку парности скобок и прямую&lt;br /&gt;
выгрузку результата в ''SciLab'' на выполнение.&lt;br /&gt;
&lt;br /&gt;
При помощи текстового редактора ''SciPad'' мы сможем создать более элегантное решение для расчета дальности полета тела, брошенного под углом к горизонту (о чем упоминалось ранее). А именно, мы напишем внешнюю функцию, которую можно будет подгружать во время работы и пользоваться ею так же, как и встроенными. Кстати, именно так и выполнены все расширения и многие встроенные функции системы ''SciLab''. Чтобы убедиться в этом, откройте&lt;br /&gt;
каталог, куда был установлен ''SciLab''. Если вы используете двоичную версию с '''LXFDVD''', то это папка, в которую вы распаковали архив; если же вы устанавливали программу через менеджер пакетов вашей системы, то поищите в '''/usr/lib''' каталог с именем '''scilab-4.1.2''', в моем дистрибутиве (Mandriva 2008.1) он располагается именно там. Затем перейдите в каталог '''macros''', и вы увидите множество каталогов, имена которых напоминают названия блоков&lt;br /&gt;
функций в справке (''elem – Elementary Function, optim – Optimisation and simulation и так далее''). Внутри них находятся файлы с расширениями '''.bin''' и '''.sci''': первые – это откомпилированные версии функций,&lt;br /&gt;
а вторые – исходные тексты. Я рекомендую всем покопаться здесь,&lt;br /&gt;
поскольку именно так, в отсутствие справочных материалов, можно&lt;br /&gt;
не только досконально изучить принципы создания приложений в&lt;br /&gt;
''SciLab'', но и выяснить причины возникновения ошибок при использовании стандартных функций. Может оказаться, что реализованный разработчиками метод (все мы не без греха) неэффективен или содержит ошибку, тогда вы сможете его исправить. Кроме того,&lt;br /&gt;
настоятельно рекомендую посмотреть содержимое каталога '''/usr/lib/scilab-4.1.2/demos''', в котором находятся исходные тексты всех&lt;br /&gt;
демонстрационных примеров.&lt;br /&gt;
&lt;br /&gt;
Вернемся к нашей задаче. Полный текст функции приведен на рис. 2. Первые строки, начинающиеся с двойного слэша ('''//''') – это комментарии. Затем идет заголовок функции:&lt;br /&gt;
&lt;br /&gt;
  function [&amp;lt;список выходных параметров&amp;gt;] = &amp;lt;Имя Функции&amp;gt;(&amp;lt;список входных параметров&amp;gt;)&lt;br /&gt;
    &amp;lt;тело функции&amp;gt;&lt;br /&gt;
  endfunction&lt;br /&gt;
&lt;br /&gt;
В дальнейшем именно '''Имя функции''' и будет использоваться в окне ''SciLab''. Все остальное является локальным содержимым и на рабочую среду оказывать влияния не будет. Следует отметить, что если&lt;br /&gt;
при определении функции не указаны выходные параметры, то есть&lt;br /&gt;
функция ничего не возвращает, то она будет являться процедурой.&lt;br /&gt;
Как правило, в виде процедур оформляются такие участки программы, как отрисовка графика или картинки, ввод и проверка данных&lt;br /&gt;
и т.д.&lt;br /&gt;
&lt;br /&gt;
В следующих двух строках мы определяем значение ускорения свободного падения и переводим угол из градусов в радианы.&lt;br /&gt;
Далее, поскольку мы будем использовать функцию '''fsolve''', задается&lt;br /&gt;
начальное приближение и устанавливается значение времени, равное&lt;br /&gt;
нулю. Как уже говорилось ранее, '''fsolve''' ищет решение, ближайшее к&lt;br /&gt;
начальному приближению, поэтому его необходимо задать так, чтобы найденное время было больше нуля. Для этого мы увеличиваем&lt;br /&gt;
начальное приближение (переменная '''Init_t''') на '''10''' в цикле до тех пор,&lt;br /&gt;
пока найденное решение (переменная '''t''') не станет положительным.&lt;br /&gt;
Таким образом мы сможем найти момент, когда тело упадет на землю. А затем, по формуле для равномерного движения, мы вычисляем,&lt;br /&gt;
какое расстояние пройдет тело за это время вдоль горизонтальной&lt;br /&gt;
оси.&lt;br /&gt;
&lt;br /&gt;
Результаты вычисления заносятся в переменные, являющиеся выходными параметрами. В нашем случае он один – '''s'''. На этом&lt;br /&gt;
выполнение функции заканчивается, и результат передается на&lt;br /&gt;
выход. Теперь нам осталось записать функцию в файл. Для этого&lt;br /&gt;
выберите последовательно пункты меню '''File &amp;gt; Save as...''' или воспользуйтесь комбинацией клавиш '''Ctrl+Shift+S''' и сохраните файл в своем домашнем каталоге под именем '''flyrange.sci'''.&lt;br /&gt;
&lt;br /&gt;
В следующий раз, когда нам понадобится эта функция, мы сможем подключить ее при помощи процедуры '''getf''', которая принимает полный путь и название файла функции. Предположим, что вы ('''firstuser''') сохранили файл в своем домашнем каталоге. Тогда команда будет такой:&lt;br /&gt;
&lt;br /&gt;
  getf /home/firstuser/flyrange.sci&lt;br /&gt;
&lt;br /&gt;
После ее выполнения вы сможете использовать вашу собственную функцию в вычислениях. Кроме того, функцию можно загрузить&lt;br /&gt;
в ''SciLab'' непосредственно из редактора ''SciPad'', для чего необходимо последовательно выбрать пункты меню '''Execute &amp;gt; Load into Scilab''' или нажать комбинацию клавиш '''Ctrl+Shift+I'''. После этого весь исходный&lt;br /&gt;
код будет передан в ''SciLab ''и выполнен. Если вы создали в редакторе&lt;br /&gt;
не функцию, а просто последовательность команд, она будет выполнена, а результат – выведен на экран.&lt;br /&gt;
&lt;br /&gt;
Конечно, лучше было бы самостоятельно реализовать численный метод решения уравнения, но выбранный нами подход&lt;br /&gt;
позволяет получить компактный код, а также демонстрирует возможность использования встроенных функций при разработке программ.&lt;br /&gt;
&lt;br /&gt;
===Отладка===&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение: LXF107_83_1.jpg|Рис. 3.|300px]]Рис. 3. Окно для ввода значений входных параметров перед запуском режима отладки.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Если при создании вашей собственной функции или процедуры у вас&lt;br /&gt;
возникли трудности: неверный результат, ошибка при вычислении&lt;br /&gt;
или что-то еще, то вы всегда можете выполнить программу в режиме&lt;br /&gt;
пошаговой отладки.&lt;br /&gt;
&lt;br /&gt;
Прежде чем перейти в режим отладки, вам следует определить значения входных параметров, поскольку в противном случае функция не сможет работать. Для этого либо последовательно выбираем пункты меню '''Debug &amp;gt; Configure Execution...''', либо нажимаем клавишу&lt;br /&gt;
'''F10'''. В данном случае появится окно, показанное на рис. 3. В верхней строчке вы можете указать функцию, из которой следует брать входные параметры (если таковая имеется), и нажать кнопку '''Obtain'''.&lt;br /&gt;
Если же входные параметры должны вводиться пользователем, придется указать их вручную. Для этого следует выбрать переменную из&lt;br /&gt;
списка и нажать кнопку '''Add/Change'''. В появившемся окне, в первой&lt;br /&gt;
строке отображается имя переменной, а во второй – вводится ее&lt;br /&gt;
значение. Кроме того, если какой-либо переменной нет в списке, вы&lt;br /&gt;
можете добавить ее, просто изменив имя в первой строке. Нажатие&lt;br /&gt;
второй кнопки ('''Remove''') приводит к удалению выделенной в данный&lt;br /&gt;
момент переменной.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение: LXF107_83_2.jpg|Рис. 4.|300px]]Рис. 4. Окно наблюдения в режиме отладки нашей функции. Установлен флажок автоматической загрузки в окно всех локальных переменных.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Итак, пусть входные параметры определены. Нажмите кнопку '''OK'''&lt;br /&gt;
и закройте это окно. Теперь, если вы вновь выберете пункт меню&lt;br /&gt;
'''Debug''', то увидите, что практически все пункты меню стали активны.&lt;br /&gt;
Вы можете установить/убрать точку останова в текущей строке ('''F9'''),&lt;br /&gt;
удалить все точки останова ('''Ctrl+F9'''), выполнить до курсора ('''Ctrl+F11''')&lt;br /&gt;
и так далее. Пошаговое перемещение выполняется при помощи клавиш '''F8''' (без захода в подпрограммы) '''Shift+F8''' (с заходом в подпрограммы). В ходе выполнения программы вы также можете просматривать значения локальных переменных. Для этого следует вывести&lt;br /&gt;
на экран окно наблюдения ('''Watch'''), нажав '''Ctrl+F12''' или '''Debug &amp;gt; Show watch'''. Окно наблюдения содержит три области (рис. 4):&lt;br /&gt;
&lt;br /&gt;
* верхняя – для наблюдения за значениями переменных. При помощи кнопки '''Add/change''' вы можете добавлять и изменять переменные. Кроме того, здесь есть две очень полезные опции: '''Auto (local variables)''' и '''Auto watch globals too'''. Выбор первой позволяет автоматически перенести в окно наблюдения все локальные переменные, а второй – глобальные. Как видно из рис. 4, последнее вычисленное значение отображается красным цветом.&lt;br /&gt;
* срединная область для проведения вычислений с текущими значениями переменных.&lt;br /&gt;
* нижняя область для отображения стека вызовов.&lt;br /&gt;
&lt;br /&gt;
Таким образом, вы можете полностью контролировать процесс выполнения.&lt;br /&gt;
&lt;br /&gt;
Конечно же, рамки статьи не позволяют мне описать все, что хотелось бы, особенно это касается программирования. Но я надеюсь, что&lt;br /&gt;
данная статья даст вам некоторое представление о возможностях и принципах работы ''SciLab'' с функциями. Если вас заинтересовала эта тема, напишите нам на {mailto:letters@linuxformat.ru letters@linuxformat.ruЪ – возможно, мы выпустим несколько уроков по программированию в ''SciLab''. '''LXF'''&lt;br /&gt;
&lt;br /&gt;
===Форматируем график===&lt;br /&gt;
&lt;br /&gt;
Опции форматирования линии двумерного графика в ''SciLab'' разбиты на&lt;br /&gt;
три категории: цвет линии, тип линии, маркер значения. Они указываются в&lt;br /&gt;
функции '''plot''' в кавычках в любом порядке после массивов с данными для&lt;br /&gt;
построения. Ниже приведена таблица с описанием каждого из параметров.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:LXF107_83_3.jpg]]&lt;/div&gt;</description>
			<pubDate>Mon, 24 Aug 2009 05:50:48 GMT</pubDate>			<dc:creator>Crazy Rebel</dc:creator>			<comments>http://wiki2.linuxformat.ru/index.php/%D0%9E%D0%B1%D1%81%D1%83%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5:LXF107:SciLab</comments>		</item>
	</channel>
</rss>