求解一道matlab題,選了數值分析,結果悲慘的發現自己不會

時間 2022-08-09 15:10:07

1樓:久久不能記住

clear,clc

%% 求ln(x+sinx)=0的根。初值x0分別取0.1, 1,1.5, 2, 4進行計算

eq1 = @(x) log(x+sin(x));

x10 = [.1,1.5,2,4];

[x1,val1,flag1] = arrayfun(@(i)newton(eq1,x10(i)),1:length(x10));%未加速

[x1s,val1s,flag1s] = arrayfun(@(i)newton(eq1,x10(i),1),1:length(x10));%加速

%% 求sinx=0的根。初值x0分別取1,1.4,1.6, 1.8,3進行計算

eq2 = @(x) sin(x);

x20 = [1,1.4,1.6,1.8,3];

[x2,val2,flag2] = arrayfun(@(i)newton(eq2,x20(i)),1:length(x20));%未加速

[x2s,val2s,flag2s] = arrayfun(@(i)newton(eq2,x20(i),1),1:length(x20));%加速

以上程式要用到的newton函式如下,已經幫你整合了steffensen加速法,具體用法函式裡邊寫得很清楚,自己複製貼上到m檔案儲存,m檔案命名為newton.m,放在同一路徑下方可使用

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

function [x,val,exitflag] = newton(eq,x0,steff,tol,mindx,maxiter)

%牛頓法解方程

%[x,val,exitflag] = newton(eq,x0,steff,tol,mindx,maxiter)

%x為方程的解;

%val為上述x帶入eq的值;

%exitflag為1,求解成功;exitflag為0,達到最大迭代次數未收斂;

%exitflag為-1,步長達到最小未收斂;

%eq:函式控制代碼;

%x0:初值,預設為0到1隨機;

%steff為加速引數,非負則加速。預設不加速;

%tol:容差,預設1e-10;

%mindx:最小迭代步長,預設1e-8;

%maxiter:最大迭代數目,預設1e4;

%例如 x = newton(@(x)log(x+sin(x)),1) 得到 x = 0.5110;

%14-nov-2011 11:39:48,by jjbnjz

if ~isa(eq,'function_handle')

error('我擦,要我說幾遍你才知道要用函式控制代碼啊')

endif nargin < 6

maxiter = 1e4;

if nargin < 5

mindx= 1e-8;

if nargin < 4

tol= 1e-10;

if nargin < 3

steff = -1;

if nargin < 2

warning('初值都沒給,那從0到1之間隨便選了啊')

x0 = rand;

endend

endend

endx = x0;

val = eq(x0);

exitflag = 1;

eval(['df =@(x)' char(diff(eq(sym('x')))),';']);

if abs(val) <= tol

disp('你給的初值就是解,還算個毛啊,再見')

return

endif steff <= 0

for iter = 1 : maxiter

val = eq(x);

dval = df(x);

xnew = x - val/dval;

val = eq(xnew);

if abs(val) < tol

x = xnew;

return

endif abs(x-xnew) < mindx

exitflag = -1;

disp(['迭代步長已經小於設定的最小步長(預設1e-8),',...

'而表示式的值沒有小於給定容差(預設1e-10)'])

x = xnew;

return

endx = xnew;

endelse

st=@(x)x - eq(x)/df(x);

for iter = 1 : maxiter

xnew = x - (st(x)-x)^2 / (st(st(x)) -2*st(x) + x);

val = eq(xnew);

if abs(val) < tol

x = xnew;

return

endif abs(x-xnew) < mindx

exitflag = -1;

disp(['迭代步長已經小於設定的最小步長(預設1e-8),',...

'而表示式的值沒有小於給定容差(預設1e-10)'])

x = xnew;

return

endx = xnew;

endend

disp('因達到最大迭代次數而終止,求解失敗;解決方法,要麼增大容差(精度下降),要麼增大迭代次數(變慢)')

exitflag = 0;

end%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

問題分析什麼的就自己寫吧,無非是些:「解方程,初值是關鍵」,「自從我用了steffensen的加速方法後,嘿,還別說,還真對得起咱這張臉,從前不收臉的也收臉了,收臉的速度的也快了」,「牛頓法求解方程得到的解和初值間的距離居然和初值的導數值有關,導數值越小的初值解出來離初值越遠,怎麼回事呢?自己看書吧」,「不管怎麼說,steffensen還是收斂的比較好的,相比沒有他,我們離初值更近了╮(╯_╰)╭」

2樓:匿名使用者

同學,你交大的吧,自己學一下matlab。

3樓:魏把缺

function x_star=newton(fname,dfname,x0,e,n)

if nargin<5

n=50;

endif nargin<4

e=10^(-5);

enddigits(50);

x=x0;

x0=x+2*e;

k=0;

while abs(x0-x)>e

k=k+1;

if k>n

error('迭代失敗');

return;

endx0=x;

x=x0-feval(fname,x0)/feval(dfname,x0);

disp(x);

endx_star=x;

disp(k);end

4樓:普寧市電器廠

兄弟你是選的趙海良的課呀?

用matlab求一道數值分析的題

用matlab程式設計數值分析的一道題目有。

5樓:匿名使用者

程式如下:

x=[0    1     2      3     4      5       7       9        10      11      11.5      12 ]  ;

y=[0    1.5  3.2   4.

8   5.5   6.4    9.

6    7.5    6.7      7.

8      8.2        8.5];

a1=polyfit(x,y,3);

syms x

f3=vpa(poly2sym(a1,x),4)%多項式三次擬合結果

a2=polyfit(x,y,5);

f5=vpa(poly2sym(a2,x),4)%多項式五次擬合結果

x1=0:0.001:13;

h1=polyval(a1,x1);

h2=polyval(a2,x1);

plot(x,y,'o',x1,h1,x1,h2)

xlabel('x');

ylabel('y')

title('多項式3,5次擬合擬合曲線')

legend('原始資料點','3次擬合','5次擬合')

結果:f3 =

0.006647*x^3 - 0.2154*x^2 + 2.325*x - 0.3845

f5 =

0.0007557*x^5 - 0.01867*x^4 + 0.1477*x^3 - 0.5009*x^2 + 2.092*x - 0.03306

matlab 解析解轉換數值解

6樓:匿名使用者

subs 替換變數為數值

double 將解析解符號轉變為雙精度數值

7樓:

你可能誤解了解析解與數值解的**。

solve給你的是解析解,你得到解析解以後,給引數賦值,然後再使用eval()函式,即可得到結果(但不是你說的數值解)。

如果需要數值解,用積分來說吧,我們有辛普森(simposon),trapzoidal等方法,解方程還有gradient based等。

這些matlab也有相關的函式。

建議你看一本書,叫做:computaitonal methods for engineers,裡面都是用matlab實現數值解的方法。

8樓:

你可以自己編個演算法,比如計算方法裡講過的二分法和切線法都是數值解的解法

9樓:匿名使用者

vpa(解析解)=數值解

10樓:匿名使用者

都有解析解了你還要數值解幹嘛?把變數帶進去不就是數了麼,不理解你是啥意思。

matlab 解方程用matlab 解這個方程的數值解,急 10

11樓:和藹的禾鬥

我求解出現複數,感覺這不是你想要的結果,但我還是放這吧!

solve('((5.7182*x^2-9.4364*x+5.577)/(1-2*x))*log((1-x)/x)+3.7182*log(x)-1.704=0','x')

ans =

.50000000000000000000000000000000+.17473052282862965912408182829672*i

誰能幫我做一下關於數值分析的一道題,謝謝啦!用matlab

12樓:匿名使用者

xi_a= [0.2 0.4 0.6 0.8 1.0];

fxi_a= [0.98 0.92 0.81 0.64 0.38];

xi_b= [0.2,0.2+0.08*1,0.2+0.08*11,0.2+0.08*10]; %所求(xi,yi)橫座標

fxi_b= interp1(xi_a,fxi_a,xi_b,'linear'); %這是線性差值

fxi_c= interp1(xi_a,fxi_a,xi_b,'spline'); %這是?三次樣條函式?

fxi_d= interp1(xi_a,fxi_a,xi_b,'newton'); %這是?牛頓差值?

或者可以參考

一道Matlab程式設計題,matlab程式設計題

義敏學系歌 可是,你為什麼要到我這個mathematica專攻的團隊來提問呢 那我也給個mma的解法來消滅這個提問吧 nintegrate sqrt total d t 2 400.953 開濮耿昭 1.首先舉一個簡單的例子 求y x 2 在x為 0,2 上的曲線長度。把下面的複製貼上進matlab...

求解一道生物題,求解一道c語言題

sch知與誰同 當然題目只有限定於二倍體生物,且預設兩個次級精母細胞只有乙個 異常才有解,答案為axb,0y,0y。這種題目的解法就是要通過雙向推理還原 過程 aaxby經細胞減一之前的間期複製後,基因組成為a aa axb xby y,之後無論怎麼 基因的種類與數量應該不變 再從結果分析,a與a出...

求解一道物理題,求解一道物理題

一開始物體的速度大於傳送帶的速度,相對傳送帶向下滑動,物體受到的摩擦力方向沿斜面向上。a g sin30 cos30 10 0.5 0.75 2.5m s 2,方向沿斜面向上。物體做勻減速運動。末速度取v 2m s和皮帶輪速度相同。位移設為x,則有 v 2 v0 2 2ax 4 64 2 2.5 x...