matlab - while循环直到值收敛

时间:2013-05-22 08:13:33

标签: matlab loops

我需要解决以下等式:

old_val = 0.4*U_Z/(log(5/new_val));

其中

new_val = 0.11*1.5e-5./old_val;

为了计算new_val和old_val,我需要编写一个计算new_val和old_val的循环,然后获取new_val的真值,就像new_val是前一个new_val的0.001%一样。

我有关于使用while循环执行此操作,我认为可能会有效。不过,我对如何启动while循环感到有点困惑,我应该:

while abs((new_val(i) - val_prev(i))) > 0.000001     
    old_val = 0.4*W(i)/(log(5/new_val));
    dummy = new_val(i);
    new_val = 0.11*1.5e-5./old_val;
    val_prev(i) = dummy;
end

    while abs((new_val(i) - val_prev(i))) / abs(val_prev(i)) > 0.000001     
    old_val = 0.4*W(i)/(log(5/new_val));
    dummy = new_val(i);
    new_val = 0.11*1.5e-5./old_val;
    val_prev(i) = dummy;
end

其中

val_prev = new_val*1.1; 

用于启动迭代。 while循环用于继续运行循环,直到new_val和val_prev在彼此的0.001%之内。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您想要为x

解决这个等式
x =  0.4*U_Z/log( 5/(0.11*1.5e-5./x) )

U_Z有些不变。如果这确实是你想要做的,我会把它重写为

x * log( 5*x/1.65e-6 ) - 0.4*U_Z == 0

并像这样解决:

x_sol = fzero(@(x) x .* log( 5*x/1.65e-6 ) - 0.4*U_Z, 1)

或者,如果你坚持,使用你自己的Newton-Raphson方案:

fx   = @(x) x .* log( 5*x/1.65e-6 ) - 0.4*U_Z
dfdx = @(x) log(x) + 15.9242;

x = 1;
f = fx(x);
while abs(f) > 1e-6   
    x = x-f/dfdx(x);
    f = fx(x);
end

但我不确定这是不是你想要的......