MATLAB的一些基礎知識


 1.已知a1=sin(sym(pi/4)+exp(sym(0.7)+sym(pi/3)))產生精准符號數字,請回答:以下產生的各種符號數哪些是精准的?若不精准,誤差又是多少?能說出產生誤差的原因嗎?

a2=sin(sym(pi/4)+exp(sym(0.7))*exp(sym(pi/3)))

a3=sin(sym('pi/4')+exp(sym('0.7'))*exp(sym('pi/3')))

a4=sin(sym('pi/4')+exp(sym('0.7+pi/3')))

a5=sin(sym(pi/4)+exp(sym(0.7+pi/3)))

a6=sin(sym(pi/4)+sym(exp(0.7+pi/3)))

a7=sin(sym(pi/4+exp(0.7+pi/3)))

a8=sym(sin(pi/4+exp(0.7+pi/3)))

(提示:可用vpa觀察誤差;注意數位的設置)。

解答:

這里首先介紹一個函數vpa:

 1 %{
 2 一、要修改運算的精度,需要digits()函數和vpa()函數同時執行,單獨使用digits函數不會改變運算精度!
 3 二、vpa()函數對函數內部的變量運算過程不修改精度
 4 %}
 5 clear,clc;
 6 format long; 
 7 %digits(m)  ,這里設置的vpa會使用digits設定的精度位數m
 8 digits(2),vpa(pi),vpa(2*pi)
 9 
10 %vpa(pi,n)  n>=m才可以   
11 vpa(pi,30)
View Code

執行結果為:

這里面說明了vpa()函數的用法,本次實驗保留位數為30.

接着介紹一個函數sym.  

S = sym(A)將非符號對象(如,數字,表達式,變量等)A轉換為符號對象,並存儲在符號變量S中.  但是需要注意的一點是:如果A是整數,那么sym('A')和sym(A)沒有任何區別,但是如果不是整數,結果可能不一樣:前者以字符串的形式傳給符號運算內核,可以保留完整的精度;而后者經過浮點數運算之后再轉換為符號類型,存在精度損失。

測試代碼如下:

1 %整數
2 sym('3')==sym(3)
3 
4 %非整數,前者以字符串的形式傳給符號運算內核,可以保留完整的精度;
5 %而后者經過浮點數運算之后再轉換為符號類型,存在精度損失。
6 sym('sqrt(2)-1')-sym(sqrt(2)-1) 
View Code

測試結果如下:

 

本題測試代碼如下:

 1 clear,clc;
 2 format long; 
 3 digits(2);
 4   
 5 a1=sin(sym(pi/4)+exp(sym(0.7)+sym(pi/3)));
 6 a2=sin(sym(pi/4)+exp(sym(0.7))*exp(sym(pi/3)));
 7 a3=sin(sym('pi/4')+exp(sym('0.7'))*exp(sym('pi/3')));
 8 a4=sin(sym('pi/4')+exp(sym('0.7+pi/3')));
 9 a5=sin(sym(pi/4)+exp(sym(0.7+pi/3)));
10 a6=sin(sym(pi/4)+sym(exp(0.7+pi/3)));
11 a7=sin(sym(pi/4+exp(0.7+pi/3)));
12 a8=sym(sin(pi/4+exp(0.7+pi/3)));
13 
14 %vpa(a1,30)
15 da2 = vpa(a1-a2,30)
16 da3 = vpa(a1-a3,30)
17 da4 = vpa(a1-a4,30)
18 da5 = vpa(a1-a5,30)
19 da6 = vpa(a1-a6,30)
20 da7 = vpa(a1-a7,30)
21 da8 = vpa(a1-a8,30)
測試代碼

執行結果如下:da2 =0.0    da3 =0.000000000526537778494579980984266569899      da4 =0.0000000000162197098301695333225327542401

da5=0.000000000000000887482271695958461952368291362    da6=0.00000000000000148912212817656334175587101055

da7=0.00000000000000151885559392782263589719125845     da8=0.00000000000000151859755909122793880745885451

到這里可以看出除了第一個測試語句與標准語句結果相同外,其余皆有誤差。誤差原因:從結果可以看出sym(A)與sym('A')的誤差差別對結果帶來的影響。

 

2. 請讀者先運行以下指令

a=0;b=pi;

t1=a:pi/9:pi;

t2=linspace(a,b,10);

T=t1*t2';

F=find(T<0);

然后,請回答變量a、t1、T、F的維度、規模、長度分別是多少?t1完全等於t2嗎?為什么?

a是單變量 ,t1是1*10的向量,T是單變量([1][10]  *  [10]*[1]  -->[1]*[1]),F=0.

t1完全等於t2,因為t1是從0開始到pi,間隔為pi/9的序列,共10個數;而t2是0到pi之間的等間隔的十個數。 

 

3. 對於指令A=reshape(1:18,3,6)產生的數組

A =

     1     4     7    10    13    16

     2     5     8    11    14    17

     3     6     9    12    15    18

先請你用一條指令,使A數組中取值為2、4、8、16的元素都被重新賦值為NaN。然后,再請你用一條指令,把A數組的第4、5兩列元素都被重新賦值為Inf。

 A([2 4 8 16])=NaN

 A([10 11 12 13 14 15])=Inf

 執行結果如下圖:

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM