我需要在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是时间的函数。
答案 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)
。