如何更改值并执行Newton-Raphson函数

时间:2014-01-06 14:56:24

标签: arrays matlab cell

我需要在MATLAB中迭代Newton-Raphson。这似乎很容易,但我无法弄清楚我错在哪里。问题是:

对于mmm = 1: 1)如果m = 1,则取c1 = c1b,c2 = 1-c1,并为u1,2(i)和p1,2(i)进行循环

2)如果m = 2,取c1 = c1 + dc和c2 = 1-c1,这次用新c1和c2为u1,2(i)和p1,2(i)

3)如果m = 3,取c1 =(c1 * st(1) - (c1-dc)* st(2))/(st(1)-st(2))并为新c1做循环和c2。

然后增加迭代次数:mmm = 2; mmm保持N-R迭代次数的计数。第一次迭代具有mmm = 1,第二次mmm = 2等(此特定运行仅进行2次迭代)。 sumint在积分里面。

我需要在代码中绘制这些数字,但MATLAB会在下面给出错误。请帮帮我。

代码的相关部分:

ii=101;
   u = cell(2, 1);
ini_cond = [0,0];
for i = 1:2;
   u{i} = zeros(1,ii);
   u{i}(:, ii) = ini_cond(i) * rand(1, 1);
end    


for i=1:ii;
        fikness=fik*sin(pi.*x);
        u{1}(i)=(c1-H1D*(x-0.5)+AD/2.*(x-0.5).^2)./(H1-0.5*fikness-A*(x-0.5));
        u{2}(i)=(c2+H1D*(x-0.5)-AD/2.*(x-0.5).^2)./(1.-H1+0.5*fikness+A*(x-0.5)); 
end

p = cell(2, 1);
q = cell(2, 1);


for i = 1:2;
   p{i} = zeros(1,ii);
   q{i} = zeros(1,ii);
end    

p{1}(1)=0.5*(1.-u{1}(1).^2);
q{1}(1)=0;
p{2}(1)=0.5*(1.-u{2}(1).^2);
q{2}(1)=0;

for i=2:101

q{1}(i)=q{1}(i-1)-dx*(u{1}(i-1)-ub{1}(i-1))./dt;
p{1}(i)=0.5*(1.-u{1}(i).^2)+q{1}(i);
q{2}(i)=q{2}(i-1)-dx*(u{2}(i-1)-ub{2}(i-1))./dt;
p{2}(i)=0.5*(1.-u{2}(i).^2)+q{2}(i);

end


st = zeros(2, length(t));
st(1,:)=p{1}(100)-p{2}(100);
m=m+1;

if m==3; 
c1=(c1*st(1)-(c1-dc)*st(2))/(st(1)-st(2));
c2=1-c1;
end
for i = 1:2;
   sumint{i} = zeros(1,length(t));
end 
sumint = cell(2, 1);
sumint{1}(1)=0.5*(p{2}(1)-p{1}(1));
sumint{2}(1)=0.5*(p{2}(1)-p{1}(1)).*(-1/2);

for i=2:ii-1;
x=(i-1)*dx;
sumint{1}(i)=sumint{1}(i-1)+(p{2}(i)-p{1}(i));
sumint{2}(i)=sumint{2}(i-1)+(p{2}(i)-p{1}(i))*(x-1/2);

end

H1DDOT=-sumint{1}.*dx./rmass;
H1D=H1D+dt*H1DDOT;
H1=H1+dt*H1D;
ADDOT=sumint{2}*dx./rmomi;
AD=AD+dt*ADDOT;
A=A+dt*AD;

H1L=H1+A.*0.5;
H1R=H1-A.*0.5;
H2=1.-H1;
rat1=AD./ADinit;
rat2=ADDOT./AD;

u是速度p是压力c1,c2是外倾效应H1DDOT和ADDOT是H1和A的第二个推导.sum1和sum2是用于定义H1DDOT和ADDOT值的积分内部。 H1DDOT和ADDOT是时间的函数。

1 个答案:

答案 0 :(得分:0)

正如您从邮件中看到的那样,错误在于以下行:

sumint{2}(i)=sumint{2}(i-1)+(p{2}(i)-p{1}(i)).*(x-1/2);

现在,让我们找出原因:

sumint{2}(i) = ...

此部分表示您希望将右侧的任何内容插入到单元格i中数组的sumint{2}位置。这意味着,右侧必须是标量。

是吗?

嗯,sumint{2}(i-1)+(p{2}(i)-p{1}(i))肯定是一个标量,因为你使用单个值作为所有向量/数组的索引。问题是乘法.*(x-1/2);

从上面的代码可以看出,x是一个向量/数组,(因为你使用length(x)等)。将标量sumint{2}(i-1)+(p{2}(i)-p{1}(i))乘以向量x,会返回一个向量,如上所述,它将不起作用。

也许您想要i的{​​{1}}值?

您的代码中还有其他一些奇怪的事情,例如:

x

为什么你这里有一个循环?你没有循环任何东西,你正在做相同的计算100次。我想这应该是for i=1:101; fikness=fik*sin(pi.*x); u{1}=(c1-H1D*(x-0.5)+AD/2.*(x-0.5).^2)./(H1-0.5*fikness-A*(x-0.5)); u{2}=(c2+H1D*(x-0.5)-AD/2.*(x-0.5).^2)./(1.-H1+0.5*fikness+A*(x-0.5)); end

更新

您引入了新错误,因为您已将x(i)更改为标量。然后x将只是一个标量,这意味着u = zeros(1,length(x))将失败u{1}(i)