Difference between revisions of "Упражнение 3. Matlab"

From Ilianko
Line 265: Line 265:
 
  0.83333333333333325931846502498956397175788879394531
 
  0.83333333333333325931846502498956397175788879394531
 
   
 
   
 +
>>a = double(ans)
 +
a =
 +
0.833333333300000
 +
 +
1.0e10+ 1.0e-10
 +
ans =
 +
    1.000000000000000e+10
 +
 +
sym('1.0e10')+ sym('1.0e-10')
 +
ans =
 +
10000000000.0000000001
 +
 +
Matrica double  прецижан
 +
 +
F= [exp(1) sqrt(2); log(3) rand]
 +
 +
F =
 +
 +
  2.718281828459046  1.414213562373095
 +
  1.098612288668110  0.814723686393179
 +
 +
V = vpa(F,30)
 +
 +
V =
 +
 
 +
[ 2.71828182845904553488480814849,  1.41421356237309514547462185874]
 +
[ 1.09861228866810956006361266191, 0.814723686393178936349102059467]
 +
 +
 +
S = sym(F)
 +
S =
 +
 
 +
[ 3060513257434037/1125899906842624,                          2^(1/2)]
 +
[ 2473854946935173/2251799813685248, 7338378580900475/9007199254740992]
 +
 +
 
[[Category:Matlab]]
 
[[Category:Matlab]]

Revision as of 12:56, 15 April 2011

Управляващи оператори

if

if <expression>
  statment
end

if <expression>
 statement;
else
 statement;
end

if <expression>
 statement;
elseif
 statement;
else
 statement;
end

Релации и логически оператори

< , <= , >, >= , ~=, ==

&, &&, |, ||, ~

Логическо равенство да не се ползва за числа с плаваща запетая


switch

switch expression
 case val1
   statement
 case {val2, val3
   statement
 otherwise
   statement
end

Логическо равенство да не се ползва за числа с плаваща запетая

for

for index = nachalo:stypka:kraj % ako nqma stypka tq e 1
  statement
end
for i = A % A e vektor/matrica
  statement
end

while

while expression
 statemnet
end

Dopълнителни управляващи оператори

break continue - преминаване към следваща итерация на for или while цикъл pause - пауза до натискане на клавиш ( pause(4) <=> sleep(4) ) keyboard - predawa uprawlenieto на клавиатурата (използва се при дебъгване). Спира се програмата и може да проверяваме всички стойност return - връща се към програмата след keyboard

файл функции

function [a, b, c] = ime(x, y, z)
  global p, q;
  a = x;
  b = y;
  c = z;
end   

Записва се като ime.m

function y = signum(x)
  % сигнум функция
  if x>0
     y = 1;
  elseif x<0
     y = -1;
  else
     0
  end
end
>> signum(-5)

ans =

    -1

>> signum(0)

ans =

     0

>> signum(5)

ans =

     1

Символни преобразувания

clear - изчистване на workspace

Задаване на символни величини

оператори за създаване на символни величини

sym - по-универсален

x = sym('x') ; 
x = 
x
>> y = pi
y =
   3.1416

Символите се показват по вляво!

Дефиниране на цял стринг

>> eq = sym ('a*x^2')
eq =
a*x^2
Диференциране по x
>> diff(eq,x)
ans =
2*a*x

Matrica на хилберт

H = hilb(5)

H =
   1.0000    0.5000    0.3333    0.2500    0.2000
   0.5000    0.3333    0.2500    0.2000    0.1667
   0.3333    0.2500    0.2000    0.1667    0.1429
   0.2500    0.2000    0.1667    0.1429    0.1250
   0.2000    0.1667    0.1429    0.1250    0.1111

Извеждане в символичен вид

>> sym(H)
ans =

[   1, 1/2, 1/3, 1/4, 1/5]
[ 1/2, 1/3, 1/4, 1/5, 1/6]
[ 1/3, 1/4, 1/5, 1/6, 1/7]
[ 1/4, 1/5, 1/6, 1/7, 1/8]
[ 1/5, 1/6, 1/7, 1/8, 1/9]

В този случай няма да има грешка от закръгляне

>> det(H)
ans =
  3.7493e-12
Sled  като отдясно всичко е символни величини и от ляво става символна
>> syms x a b z
>> f = sin(x)*exp(z)^a/b
 f =
 (exp(z)^a*sin(x))/b

По ясна визуализация

>> pretty(f)
       a
 exp(z)  sin(x)
 --------------
       b

Получаване на директно символна матрица

>> syms a b c
>> A = [a b c; b c a; c a b]

A =

[ a, b, c]
[ b, c, a]
[ c, a, b]

Изчисляване на детерминанта

>> det(A)
ans =
- a^3 + 3*a*b*c - b^3 - c^3


>> pretty(inv(A))

 +-                                                                              -+
 |                  2                         2                         2         |
 |           b c - a                   a c - b                   a b - c          |
 |  - ----------------------, - ----------------------, - ----------------------  |
 |     3              3    3     3              3    3     3              3    3  |
 |    a  - 3 a b c + b  + c     a  - 3 a b c + b  + c     a  - 3 a b c + b  + c   |
 |                                                                                |
 |                  2                         2                         2         |
 |           a c - b                   a b - c                   b c - a          |
 |  - ----------------------, - ----------------------, - ----------------------  |
 |     3              3    3     3              3    3     3              3    3  |
 |    a  - 3 a b c + b  + c     a  - 3 a b c + b  + c     a  - 3 a b c + b  + c   |
 |                                                                                |
 |                  2                         2                         2         |
 |           a b - c                   b c - a                   a c - b          |
 |  - ----------------------, - ----------------------, - ----------------------  |
 |     3              3    3     3              3    3     3              3    3  |
 |    a  - 3 a b c + b  + c     a  - 3 a b c + b  + c     a  - 3 a b c + b  + c   |
 +-

Подразбиращи се символни променливи

При повече променливи се диференцира по най близката до "х", ако няма зададена

 function  F  = intAB( f )
 % интеграл от произволна функция
 % a,b, - интервал на интегриране
 %UNTITLED3 Summary of this function goes here
 %   Detailed explanation goes here
   syms x a b;
   F = int(f, x, a, b);
 end
>> y = intAB( sin(x) )
y =
cos(a) - cos(b)


Аритметика с променлива точност

Три типа аретмитични операции

  • Numеric - тип double (точност)
  • Rational - точната аритметика
  • VPA - Variable Precision Arithmetic - сами задаваме броя на значещите числа (32 по подразбиране)


>> 1/2 +1/3
ans =
  0.833333333333333 - този резултат не е точен

Достатъчен е да обявим един параметър в символен

>> sym(1/2) + 1/3
ans =
5/6
>> vpa(1/2 +1/3)
ans =
0.83333333333333325931846502498956
>> vpa(1/2 +1/3, 20)
ans =
0.833333333333333
>> vpa(1/2 +1/3)
ans =
0.83333333333333325931846502498956397175788879394531

>>a = double(ans)
a =
0.833333333300000
1.0e10+ 1.0e-10
ans =
   1.000000000000000e+10

sym('1.0e10')+ sym('1.0e-10')

ans =
10000000000.0000000001

Matrica double прецижан

F= [exp(1) sqrt(2); log(3) rand]

F =

  2.718281828459046   1.414213562373095
  1.098612288668110   0.814723686393179
V = vpa(F,30)

V =
 
[ 2.71828182845904553488480814849,  1.41421356237309514547462185874]
[ 1.09861228866810956006361266191, 0.814723686393178936349102059467]


S = sym(F)
S =
 
[ 3060513257434037/1125899906842624,                           2^(1/2)]
[ 2473854946935173/2251799813685248, 7338378580900475/9007199254740992]