Difference between revisions of "Упражнение 3. Matlab"
Line 300: | Line 300: | ||
[ 2473854946935173/2251799813685248, 7338378580900475/9007199254740992] | [ 2473854946935173/2251799813685248, 7338378580900475/9007199254740992] | ||
+ | Сравнява се по елементно | ||
+ | >> double(V) == double(S) | ||
+ | ans = | ||
+ | 1 1 | ||
+ | 1 1 | ||
+ | == опростяване и преобразуване на изрази == | ||
+ | |||
+ | collect - използва се с полиноми и групира събираемите по степента | ||
+ | <code><pre> | ||
+ | >> p = sym('(x+a)^4 +(x-1)^3 - (x-a)^2 - a*x +x-3') | ||
+ | |||
+ | p = | ||
+ | |||
+ | x + (x - 1)^3 - a*x + (a + x)^4 - (a - x)^2 - 3 | ||
+ | |||
+ | >> pc = collect(p, x) | ||
+ | ??? Undefined function or variable 'x'. | ||
+ | |||
+ | >> pc = collect(p) | ||
+ | |||
+ | pc = | ||
+ | |||
+ | x^4 + (4*a + 1)*x^3 + (6*a^2 - 4)*x^2 + (4*a^3 + a + 4)*x + a^4 - a^2 - 4 | ||
+ | </code></pre> | ||
+ | Групирането автоматично ще избере х | ||
+ | |||
+ | Ако искаме да групираме по а, и а не е обявено с "syms a" | ||
+ | |||
+ | pc = collect(p, 'a') | ||
+ | |||
+ | pc = | ||
+ | |||
+ | a^4 + (4*x)*a^3 + (6*x^2 - 1)*a^2 + (4*x^3 + x)*a + x + (x - 1)^3 - x^2 + x^4 - 3 | ||
+ | |||
+ | === coeffs === | ||
+ | |||
+ | >> syms a b c d x; | ||
+ | >> p = a*x^3 - 2*b*x^2 + 3*c*x - 4*d; | ||
+ | >> coeffs(p) | ||
+ | |||
+ | ans = | ||
+ | [ -4, 3, -2, 1] | ||
+ | |||
+ | === horner === | ||
+ | |||
+ | === expand === | ||
[[Category:Matlab]] | [[Category:Matlab]] |
Revision as of 13:08, 15 April 2011
Contents
Управляващи оператори
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]
Сравнява се по елементно
>> double(V) == double(S) ans = 1 1 1 1
опростяване и преобразуване на изрази
collect - използва се с полиноми и групира събираемите по степента
>> p = sym('(x+a)^4 +(x-1)^3 - (x-a)^2 - a*x +x-3')
p =
x + (x - 1)^3 - a*x + (a + x)^4 - (a - x)^2 - 3
>> pc = collect(p, x)
??? Undefined function or variable 'x'.
>> pc = collect(p)
pc =
x^4 + (4*a + 1)*x^3 + (6*a^2 - 4)*x^2 + (4*a^3 + a + 4)*x + a^4 - a^2 - 4
</code>
Групирането автоматично ще избере х
Ако искаме да групираме по а, и а не е обявено с "syms a"
pc = collect(p, 'a')
pc =
a^4 + (4*x)*a^3 + (6*x^2 - 1)*a^2 + (4*x^3 + x)*a + x + (x - 1)^3 - x^2 + x^4 - 3
coeffs
>> syms a b c d x;
>> p = a*x^3 - 2*b*x^2 + 3*c*x - 4*d;
>> coeffs(p)
ans =
[ -4, 3, -2, 1]
horner
expand